2012-06-11 2 views
1

Я недавно интегрированные Doctrine 2 в мое приложение ZF, используя метод представил здесь:Zend Framework модели и Doctrine 2 Entities

http://www.zendcasts.com/unit-testing-doctrine-2-entities/2011/02/

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

Позвольте мне объяснить путаницу на примере,

Допустим, у нас есть объекты пользователей и покупки, как в примере, приведенном в ZendCast

Сейчас у меня есть эти сущности, что доктрина использует

/library/ZC/Entity 
    User.php 
    Purchase.php 

Прежде чем я имел обыкновение иметь

application/models/ 
    User.php (Application_Model_User) 
    Purchase.php (Application_Model_Purchase) 

в C lasses in application/models/Я использовал для написания функций для действий над сущностями (принцип тонкого контроллера модели Fat), например, если бы я хотел отправить электронное письмо пользователю, я бы создал метод с именем sendMail в Application_Model_User.

Теперь я не уверен, могу ли я добавлять методы к файлам в/library/ZC/Entity, или если это хорошая идея вообще, поскольку Doctrine использует эти файлы для управления базой данных.

У меня есть отдельный файл модели, у меня также были файлы карт, которые работали над более чем одной моделью, например, если бы я хотел отправить по электронной почте всех неактивных пользователей, я бы создал метод emailInactiveUsers для Application_Model_UserMapper.

Как мне это сделать сейчас?

я гугл немного, и я нашел это:

http://net.tutsplus.com/tutorials/php/zend-framework-from-scratch-models-and-integrating-doctrine-orm/

Это говорит

инструмента строительных лесов, называемые Doctrine_Cli, что создает модель из базы данных очень быстро

Однако команда "generate-models-db" не существует в моем файле scripts/doctrine.php. Я не уверен, что это то, что Doctrine прекратила поддерживать в версии 2 или что.

ответ

2

Добавление методов и свойств к вашим моделям, которые не управляются Doctrine, не должно быть проблемой. Когда дело касается карт, вам не нужны они с Доктриной. Doctrine уже занимается отображением (например, через аннотации в вашем классе Entity), а для (сложных) запросов у вас есть EntityManager/Repositories.

Я бы на месте emailInactiveUsers() в службе, которая имеет доступ к EntityManager, например:

class UserMailService 
{ 
    private $em; 

    // Inject EntityManager, e.g. via setEntityManager() or __construct() 

    public function emailInactiveUsers() 
    { 
     $mail = new \Zend_Mail(); 
     $users = $this->em->getRepository('User')->findBy(array('isActive' => false)); 
     foreach ($users as $user) { 
      $mail->addTo($user->getEmail()); 
     } 
     // And so on... 
    } 
} 

Нечто подобное sendMail() на мой взгляд, принадлежит в службе, как он действует на User-субъекта и требует зависимость к Mailer, который не должен сочетаться с моделью.

Если пользователь делает что-то, что принадлежит модели.Если что-то действует на пользователя - в вашем случае Mailer, который берет адрес электронной почты от пользователя и отправляет электронное письмо - это не так.

+0

Спасибо, но я пытаюсь выяснить, куда идут мои методы модели. Возможно, mailInactiveUsers был неправильным примером, поскольку он не должен принадлежать к модели, предположим, что у вас есть функция, которую нужно добавить в Модель, вы создаете отдельные модели или используете тот же класс, который вы создали для своих объектов Doctrine 2? – Yasser1984

+0

Просто использование сущностей является обычным явлением, поскольку это, по сути, то, что ваши классы-модели в ZF. Вы можете ассоциациям работать с объектами, которые связаны между собой, например. сделайте что-то вроде '$ user-> getPurchaseHistory()' для получения всех покупок, принадлежащих пользователю. Если вы хотите получить несколько пользователей по определенным критериям, вы можете создать собственный класс репозитория, в котором вы указываете необходимые запросы или просто их создаете (например, в своем контроллере) через QueryBuilder, извлеченный из EntityManager. – dbrumann

+0

Что я сделал, так это то, что я создал объекты, которые я сохраняю в/application/models, и он отлично работает с результатом. Спасибо – Yasser1984

 Смежные вопросы

  • Нет связанных вопросов^_^