Zend Framework 2 - формы аннотаций и Doctrine2 - устраняемая фатальная ошибка - ObjectManager

Я использую Zend, Doctrine2.1 и AnnotationForms.

Моя сущность выглядит так:

/**
 * @ORM\Entity
 * @ORM\Table(name="myentity")
 * @Form\Name("myentity")
 * @Form\Attributes({ "class": "form-horizontal" })
 * @Form\Hydrator("\DoctrineModule\Stdlib\Hydrator\DoctrineObject")
*/
class MyEntity {
   ...
}

При использовании этого DoctrineObject я получаю следующую ошибку:

Уловимая фатальная ошибка: аргумент 1, переданный в DoctrineModule \ Stdlib \ Hydrator \ DoctrineObject :: __ construct (), должен быть экземпляром Doctrine \ Common \ Persistence \ ObjectManager, не указан, вызывается в C: \ vendor \ zendframework \ zendframework \ library \ Zend \ Form \ Factory.php в строке 566 и определенный в C: \ vendor \ doctrine \ doctrine-module \ src \ DoctrineModule \ Stdlib \ Hydrator \ DoctrineObject.php в строке 63

Я не могу использовать Zend\Stdlib\Hydrator\ObjectProperty, потому что тогда я получаю

Неустранимая ошибка: невозможно получить доступ к защищенному свойству

Я совсем заблудился. Кто-нибудь знает, что я могу сделать, чтобы исправить эту проблему?

Я предполагаю, что мне нужна __construct() функция. Но что мне туда положить?


person Ron    schedule 27.12.2012    source источник
comment
1) Можете ли вы подтвердить, что вы создали экземпляр формы через службу FormElementManager? 2) Вы пробовали зарегистрировать DoctrineModule\Stdlib\Hydrator\DoctrineObject как заводской?   -  person emix    schedule 19.07.2017


Ответы (3)


Кто-то может предложить функцию только для аннотаций, если она существует, тем временем вы можете использовать этот подход:

$form = //create the annotation form WITHOUT a hydrator
$objectManager = $serviceLocator->get('Doctrine\ORM\EntityManager');
$hydrator = new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($objectManager);
$form->setHydrator($hydrator);

//continue in your controller
person Sam    schedule 27.12.2012
comment
получить ту же ошибку. может я взял не тот сервис-локатор? откуда ты это взял? - person Ron; 27.12.2012
comment
В области контроллера это будет $this->getServiceLocator(), но если это не сработает, я думаю, что мой подход вообще не сработает. Как уже упоминалось: в конце концов, недостаточно осведомлен о формах аннотаций: S - person Sam; 27.12.2012
comment
Что ж, это именно то, что я сказал в своем ответе: D См. Комментарий в строке №1: P - person Sam; 27.12.2012
comment
Дело в том, что когда я вынимаю гидратор, все работает нормально. а зачем оно мне тогда вообще нужно? - person Ron; 27.12.2012
comment
Работа гидраторов заключается в том, чтобы правильно извлекать и гидратировать данные в объекты и из них. Попробуйте обновить объект без гидратора, удивлюсь, если это сработает. Может быть, он все равно возвращается к классовым методам, так что ... :) - person Sam; 27.12.2012
comment
оно работает. но я буду придерживаться этого гидратора, если вы скажете, что его нужно использовать. никогда не работайте против фреймворка;) - person Ron; 27.12.2012
comment
Это известная проблема с doctrine / zf, для решения, работающего с аннотациями (с использованием factory), см. Обсуждение проблемы: github.com/doctrine/DoctrineORMModule/issues/102 - person takeshin; 15.07.2017

Также были проблемы с аннотационными формами. Мое решение было потрясающим. Мне потребовалось много времени, чтобы это выяснить. Моя проблема была в первой строке кода аннотации.

/**

Эта строка обычно используется для комментирования кода аннотации, но почти все оставляют ее пустой. Обычно проблем нет, но это каким-то образом вызывает проблемы в аннотациях формы. Вы должны либо добавить комментарий, либо добавить пробел, либо переместить первую строку кода вверх. Так:

/** Some comment to make this annotation work
/** (<-- a space)

или начни так:

/** @ORM\Entity

Не спрашивайте меня, почему это происходит (какая-то ошибка синтаксического анализа?). Я нашел это в сообщении на GitHub, где кто-то сообщил о подобной проблеме (https://github.com/doctrine/common/issues/331). Насколько я понял, ошибка - это не доктрина, а проблема ZF2, и о ней сообщалось.

Не уверен, что это ваша проблема, но опубликовать это было меньшим, что я мог сделать ...

person Wilt    schedule 04.04.2013

Взгляните на это решение, оно очень хорошее

person sokool    schedule 26.06.2013
comment
Возможно, вам стоит подробнее объяснить решение, если в какой-то момент ссылка прервется. - person verybadalloc; 27.06.2013