Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2在bind()之后和检查isValid()之前插入表单值_Php_Symfony - Fatal编程技术网

Php Symfony2在bind()之后和检查isValid()之前插入表单值

Php Symfony2在bind()之后和检查isValid()之前插入表单值,php,symfony,Php,Symfony,我希望fbid和game_id的组合是唯一的。 我想用form->isValid()方法测试它。但我不想通过隐藏输入传递这些值 我的实体代码: /** * @ORM\Entity * @ORM\Table(name="Member", * uniqueConstraints={ * @ORM\UniqueConstraint(columns={"fbid", "game_id"}) * }) * @UniqueEntity(fields={"

我希望fbid和game_id的组合是唯一的。 我想用form->isValid()方法测试它。但我不想通过隐藏输入传递这些值

我的实体代码:

/**
 * @ORM\Entity
 * @ORM\Table(name="Member",
 *     uniqueConstraints={
 *         @ORM\UniqueConstraint(columns={"fbid", "game_id"})
 *          })
 * @UniqueEntity(fields={"fbid","game"})
 */
class Member
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Game", inversedBy="members")
     * @ORM\JoinColumn(name="game_id", referencedColumnName="id")
     */
    protected $game;

    /**
     * @ORM\Column(type="string")
     */
    private $fbid;
我尝试:

if ($request->getMethod() == 'POST') {
    $form->bind($request);
    $member = $form->getData();
    $member->setGame( $this->game );
    $form->setData($member);
    if ($form->isValid()) {
但我有一个问题:

不能更改绑定表单的数据


该错误告诉您,如果在绑定后更改了表单数据,则无法使用isValid()检查表单有效性

为什么需要在绑定和有效性检查之间设置博弈

在绑定请求之前,您应设置相关游戏,如下所示:

//For creation, you have to initialize a new object
$member = new Member();
$member->setGame( $this->game );

$form = $this->createForm(new FormType(), $member)->getForm();

if ($request->getMethod() == 'POST') {

    $validator = $this->get('validator');
    $errors = $validator->validate($member);

    if (count($errors) > 0) {
        return new Response(print_r($errors, true));
    } else {
        // persist entity ...
    }

    $form->bind($request);
    if ($form->isValid()) {

该错误告诉您,如果在绑定后更改了表单数据,则无法使用isValid()检查表单有效性

为什么需要在绑定和有效性检查之间设置博弈

在绑定请求之前,您应设置相关游戏,如下所示:

//For creation, you have to initialize a new object
$member = new Member();
$member->setGame( $this->game );

$form = $this->createForm(new FormType(), $member)->getForm();

if ($request->getMethod() == 'POST') {

    $validator = $this->get('validator');
    $errors = $validator->validate($member);

    if (count($errors) > 0) {
        return new Response(print_r($errors, true));
    } else {
        // persist entity ...
    }

    $form->bind($request);
    if ($form->isValid()) {

创建服务并收听
FormEvents::POST_BIND
事件。在
onPostBind()
中,您可以获取要检查的值,并在必要时添加错误:

class AddGameValidation实现EventSubscriberInterface
{   
/**
*{@inheritardoc}
*/
公共静态函数getSubscribedEvents()
{
返回数组(
FormEvents::POST_BIND=>“onPostBind”,
);
}
/**
*@param\Symfony\Component\Form\Event\DataEvent$Event
*/
公共函数onPostBind(DataEvent$event)
{
$form=$event->getForm();
//获取数据
if(false==$condition){
$form->addError(新FormError('somemessage'));
}
}
}

提供服务并收听
FormEvents::POST_BIND
事件。在
onPostBind()
中,您可以获取要检查的值,并在必要时添加错误:

class AddGameValidation实现EventSubscriberInterface
{   
/**
*{@inheritardoc}
*/
公共静态函数getSubscribedEvents()
{
返回数组(
FormEvents::POST_BIND=>“onPostBind”,
);
}
/**
*@param\Symfony\Component\Form\Event\DataEvent$Event
*/
公共函数onPostBind(DataEvent$event)
{
$form=$event->getForm();
//获取数据
if(false==$condition){
$form->addError(新FormError('somemessage'));
}
}
}

Gremo的解决方案很好,但创建全局服务并侦听所有POST\u绑定事件来处理一个表单POST\u绑定并不是一个好主意。仅在创建指定表单时设置此钩子要便宜得多


下面是我的建议

Gremo的解决方案是一个好的解决方案,但创建全局服务并监听所有POST\u BIND事件来处理一个表单POST\u BIND并不是一个好主意。仅在创建指定表单时设置此钩子要便宜得多


以下是我的建议

您也可以在表单中使用事件订阅者,并收听FormEvents::POST_BIND事件。 有关使用事件订阅服务器的详细信息:


还有一个类似的stackoverflow问题:

您还可以在表单中使用事件订阅者,并收听FormEvents::POST_BIND事件。 有关使用事件订阅服务器的详细信息:


还有一个类似的stackoverflow问题:

当我这样做时,isValid()返回true,但我有一个“完整性约束冲突”(游戏值不在我的表单中),所以在检查表单后验证实体本身。我要编辑答案…fbid来自我的表单和游戏值我不明白,这就是为什么你必须验证实体本身。奇怪的是,
$validator->validate($member)
返回的值太大,无法对其进行计数或显示。当我这样做时,isValid()返回true,但我有一个“完整性约束冲突”(游戏值不在我的表单中)所以在检查表单后验证实体本身。我将编辑答案…fbid来自我的表单和游戏值。我不明白,这就是为什么你必须验证实体本身。奇怪的是,
$validator->validate($member)返回的值
太大,无法对其进行计数或显示。
$data->setSomeAdditionalField('setSomeAdditionalField');
我找不到关于setSomeAdditionalField的文档?!以及如何将动态值传递给setSomeAdditionalField哦,它只是用来显示您可以使用实体并设置它的某些字段($data->setGame,$data->setFbid…)抱歉!以及如何传递动态值“setSomeAdditionalField”您希望绑定到哪种类型的值?
$data->setSomeAdditionalField('setSomeAdditionalField'))
我找不到关于setSomeAdditionalField的文档?!以及如何将动态值传递给setSomeAdditionalField噢,它只是用来表示您可以使用实体并设置它的某些字段($data->setGame,$data->setFbid…)对不起!以及如何传递动态值“setSomeAdditionalField”您想绑定到哪种值?