Symfony2在bind()之后和check之前插入表单值isValid()

时间:2012-11-28 17:04:45

标签: php symfony

我希望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()) {

但我有这个问题:

  

您无法更改绑定表单的数据

4 个答案:

答案 0 :(得分:3)

Gremo 的解决方案很好,但创建全局服务并监听所有POST_BIND事件只是为了处理一个表单POST_BIND并不是一个好主意。仅在创建指定表单时设置此挂钩要便宜得多。

以下是我的建议https://gist.github.com/4167466

答案 1 :(得分:1)

如果您在绑定后更改了表单数据,则该错误告诉您无法使用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()) {

答案 2 :(得分:0)

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

class AddGameValidation implements EventSubscriberInterface
{   
    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::POST_BIND => 'onPostBind',
        );
    }

    /**
     * @param \Symfony\Component\Form\Event\DataEvent $event
     */
    public function onPostBind(DataEvent $event)
    {
        $form = $event->getForm();

        // Get the data

        if(false === $condition) {
            $form->addError(new FormError('Some message'));
        }
    }
}

答案 3 :(得分:0)

您也可以在表单中使用事件订阅者,也许可以收听FormEvents :: POST_BIND事件。 有关使用事件订阅者的更多信息:http://symfony.com/doc/2.0/cookbook/form/dynamic_form_generation.html

类似的stackoverflow问题:Which is the suggested place to modify binded form data in Symfony?