Я пытаюсь практиковать хороший дизайн и расширять сущность 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');
Вы не должны добавлять бизнес-логику к сущностям, вместо этого вы должны использовать модели для этого. Один из способов сделать это:
На практике это означает, что модели представляют собой простые классы 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.