У меня есть объект доктрины, форма и 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); } }
UserFIeldset:
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', ), ) ); ... } }
BaseFieldset:
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 ); }