Answer the question
In order to leave comments, you need to log in
How to properly save Zend\Form + Doctrine 2 data?
Greetings!
I study ZF2+Doctrine 2.
The situation is as follows:
1) There is a set of entities to manage the User's data.
2) Zend\Form + Fieldset
The form consists of 2 sets of fields, Primary (Entity\User) and Secondary (Entity\UserInfo). They have a structure according to the documentation.
function __construct( ObjectManager $objectManager ) {
parent::__construct('ProfileEdit');
$this->setName('ProfileEdit');
$this->setAttribute('method', 'post');
// objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager')
$this->setHydrator(new DoctrineHydrator($objectManager));
$userFieldset = new UserBasicFieldset($objectManager);
$userFieldset->setUseAsBaseFieldset(true);
$this->add($userFieldset);
$userInfoFieldset = new UserInfoFieldset($objectManager);
$this->add($userInfoFieldset);
$this->add(array(
'type' => 'Zend\Form\Element\Csrf',
'name' => 'security'
));
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Save',
)
));
}
if ($this->zfcUserAuthentication()->hasIdentity()) {
$userId = $this->zfcUserAuthentication()->getIdentity()->getId();
$objectManager = $this->getOrmEntityManager();
$form = new ProfileEditForm($objectManager);
$user = $objectManager->find('User\Entity\User', $userId);
$form->bind($user);
if ($this->request->isPost()) {
$form->setData($this->request->getPost());
if ($form->isValid()) {
$objectManager->flush();
}
}
return new ViewModel(array(
'form' => $form
));
}
Answer the question
In order to leave comments, you need to log in
Что за DoctrineHydrator? Я у себя только DoctrineObject нашел, всегда его и использовал.
Как происходит гидрация через DoctrineObject - Doctrine получает метадату для сущности которую вы гидрируете, и итерируясь по массиву переданому в hydrate обрабатывает только записи ключи которых есть в св-вах сущности. При обработки каждого ключа массива гидратор проверяет - связь ли это, и если связь то какая: в нём есть два метода для гидрации данных по связям: toOne() и toMany(), так как у вас судя по схеме ManyToMany вызовется метод toMany(), я его сюда скопирую:
// If the collection contains identifiers, fetch the objects from database
foreach ($values as $value) {
if ($value instanceof $target) {
$collection[] = $value;
} elseif ($value !== null) {
$targetObject = $this->find($value, $target);
if ($targetObject !== null) {
$collection[] = $targetObject;
}
}
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question