1

我希望 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

4 回答 4

3

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

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

于 2012-11-29T08:02:14.787 回答
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()) {
于 2012-11-28T17:12:44.230 回答
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'));
        }
    }
}
于 2012-11-28T17:14:13.280 回答
0

你也可以在你的表单中使用一个事件订阅者,并监听 FormEvents::POST_BIND 事件。更多关于使用事件订阅者:http ://symfony.com/doc/2.0/cookbook/form/dynamic_form_generation.html

还有一个类似的 stackoverflow 问题:在 Symfony 中修改绑定表单数据的建议位置是哪个?

于 2012-11-29T10:06:28.713 回答