Intereting Posts

Расширение Entity Doctrine для добавления бизнес-логики

Я пытаюсь практиковать хороший дизайн и расширять сущность Doctrine. Мой расширенный класс, модель в основном, будет иметь дополнительную бизнес-логику + доступ к базовым данным сущности.

Я использую Doctrine 2.2.1 и Zend Framework 1.11.4 и php 5.3.8

Когда я использую DQL, доктрина возвращает объект Model. Когда я использую функцию родной находки Doctrine, она ничего не возвращает :(.

ПОМОГИТЕ…

Вот как это происходит:

Bootstrap.php :

$classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH.'/doctrine'); $classLoader->register(); $classLoader = new \Doctrine\Common\ClassLoader('Models', APPLICATION_PATH); $classLoader->register(); 

Модель в APPLICATION_PATH \ models \ User.php :

 namespace Models; use Doctrine\ORM\Query; /** * Models\User * * @Table(name="user") * @Entity */ class User extends \Entities\User { public function __wakeup() { $this->tools = new Application_App_Tools(); } 

Функции поиска объектов :

НЕ РАБОТАЕТ :

 $userEntity = $registry->entityManager->find('Models\User', $userEntity); 

РАБОТЫ :

 $qry = $qb ->select('u') ->from('Models\User','u'); 

Вы не должны добавлять бизнес-логику к сущностям, вместо этого вы должны использовать модели для этого. Один из способов сделать это:

  1. Используйте модели для бизнес-логики.
  2. Создайте собственные репозитории Doctrine 2 для всех ваших запросов к базе данных (DQL или иначе) [1].
  3. Оставьте свои сущности в покое.

На практике это означает, что модели представляют собой простые классы PHP (или, возможно, расширенные рамки в зависимости от того, что вы используете), но ваши модели не имеют никакого отношения к вашей базе данных. Однако ваши модели создают экземпляр ваших репозиториев Doctrine 2. Например, UserRepository может содержать метод getUserById . В ваших хранилищах вы можете запускать свои фактические запросы и возвращать экземпляры сущностей для моделей, с которыми вы работаете.

[1] http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#custom-repositories

Поскольку я понимаю Doctrine, entityManager отвечает только за постоянные сущности, а расширение Entities\User с помощью Model\User создаст другой объект (хранится в той же таблице, что указано в docblock), но не управляется entityManager или не сталкивается с ним, потому что вы вероятно, не упоминал @InheritanceType("SINGLE_TABLE") в Entities\User docblocks:

Прочтите эти документы для получения дополнительной информации http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

То, что я пытался сделать, было плохой практикой. Я связал свою сущность DB и инструменты из zend, как упоминал @Ivan Hušnjak.

Что нужно сделать, так это де-мутация.

Бизнес-логика должна быть в сервисах \ controller, и они должны обращаться к сущности и ее методам. вы можете добавить вспомогательные функции в объект doctrine, который относится только к свойствам сущности.

Что касается моей основной цели (иметь класс сущностей, который CLI Doctrine может переписать и обновить): doctrine только ищет из изменений в собственных полях \ методы, соответственно обновляет их и отбрасывает все остальные функции (помощники). поэтому нет проблем, если позволить доктрине обновлять объект php!

ps перейти к symfony2.