【问题标题】:form not binding post values to entity表单未将帖子值绑定到实体
【发布时间】:2014-02-07 09:19:45
【问题描述】:

我有一个学说实体、一个表单和 2 个字段集。 当我用值填充实体时,值会按预期水合到表单中。 当我尝试从表单数据创建实体时,它保持为空..

我一定是忘记了什么,但就是找不到,我还有其他几个没有字段集的表单,它们按预期工作。

有什么想法吗?

在下面发布我的代码

实体:

class User
{
    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, unique=true, nullable=true)
     */
    protected $username;

    ..
}

表格:

class CreateUserForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('create-user');

        $this->setAttribute('method', 'post');

        // The form will hydrate an object 
        $this->setHydrator(new DoctrineHydrator($objectManager));

        $userFieldset = new UserFieldset($objectManager);
        $this->add($userFieldset);

        // … add CSRF and submit elements …
        $baseFieldset = new BaseFieldset($objectManager);
        $baseFieldset->setUseAsBaseFieldset(true);
        $this->add($baseFieldset);

    }
}

用户字段集:

class UserFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct($objectManager)
    {
        parent::__construct($name = 'user');

        $this->setHydrator(
            new DoctrineHydrator($objectManager, 'YrmUser\Entity\User')
        )->setObject(new User());     



        $this->add(
            array(
                'name' => 'username',
                'attributes' => array(
                    'type'  => 'text',
                    'placeholder' =>'Username',
                ),
                'options' => array(
                    'label' => 'Username',
                ),
            )
        );
        ...
    }
}

基本字段集:

class BaseFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct($objectManager)
    {
        parent::__construct('base');
        $this->setHydrator(new DoctrineHydrator($objectManager));
        $this->add(
            array(
                'name' => 'security',
                'type' => 'Zend\Form\Element\Csrf',
                'options' => array(
                    'csrf_options' => array(
                        'timeout' => 600
                    )
                )
            )
        );

        $this->add(
            array(
                'name' => 'submit',
                'attributes' => array(
                    'type'  => 'submit',
                    'value' => 'Save',
                    'class' => 'btn btn-success btn-lg confirm',
                ),
            )
        );

    }
}

控制器动作:

public function createAction()
{

    $form = new CreateUserForm($this->getObjectManager());
    $entity = new User();
    $form->bind($entity);

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setData($request->getPost());
        if ($form->isValid()) {
            $this->getObjectManager()->persist($entity);
            $this->getObjectManager()->flush();
            return $this->redirect()->toRoute($this->redirect);
        }
    }

    return array(
        'form' => $form
    );
}

【问题讨论】:

    标签: php forms doctrine-orm zend-framework2 zend-form


    【解决方案1】:

    你能在$form->isValid() 之后 var_dump $form->getData() 吗?

    或者,您可以尝试$form->isValid($request->getPost()) 而不是setData()

    【讨论】:

    • 嗨,$form-getData() 的 var_dump 显示了一个“空”用户实体(空我的意思是值都是空的)如果我使用 setData 没有区别..
    • $form->isValid($request->getPost()) 不起作用,因为它只是说我的表单对 setData 无效,但它确实验证但用户实体值为 null
    • 恕我直言,$form->isValid($request->getPost()) 有效,但验证存在问题。你可以尝试 var_dump $request->getPost()。您是否在表单上调用 prepare() 以正确启动结构?
    • $request->getPost() 转储显示了 Zend\Stdlib\Parameters 的一个对象,它有 2 个属性 'user' 和 'base' 都是包含表单字段名称 => 值的数组。所以这和预期的一样吗?在我看来,我调用 prepare()。我无法使用 $form->isValid($request->getPost()) 在 isValid() 验证之前调用 setData() 来验证我的表单
    • 如果用户是基本字段集怎么办? $userFieldset->setUseAsBaseFieldset(true); 而不是 baseFieldset
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多