Как стать автором
Обновить

Комментарии 26

Да, действительно, мне тоже нравится Doctrine2 project. Не знал что уже есть дэвы ZF2. Нужно будет попробовать, мы интегрировали 2-ю доктрину с текущим ЗФ. Даже не смотря на то что в ЗФ1 не юзаются нэймспейсы, они прекрасно интегрируются. Единственное — не понравился доктриновский конфигуратор. Не, он отлично подходит для конфигурации пхп кодом, но в конфиг файл реально вынести только параметры подключения. Получается нельзя написать универсальный ресурс-плагин. Иногда посматриваю в сторону улучшения \Doctrine\ORM\Configuration.
И еще как рекомендация, может лучше расширить котроллер добавив помощников для работы с EM, ибо строчки вида
$em = $this->getInvokeArg('bootstrap')->getResource('doctrine2');
меня могут свести с ума, да и автодополнение перестает работать. Зато
$em = $this->_getEntityManager();
смотрится лучше, а добавив phpdoc появится автодополнение.
Есть проект от самого разработчика Доктрины — но там интеграция с Doctrine1 и ZF1.
Расширение контроллера — это уже Ваш контроллер с обёрткой типа

$this->doctrineEM = $this->getInvokeArg('bootstrap')->getResource('doctrine2');

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

> Есть проект от самого разработчика Доктрины — но там интеграция с Doctrine1 и ZF1.
Можно ссылочку?

Сам использую модельный слой с доктриной из symfony в своих ZF проектах — по функциональности и стабильности на годы ушедший вперёд всех доморощенных инициатив по интеграции zf1 и doctrine1. И подключается там всё в один самописный автолоад в 20 строчек
Спасибо, отличная статья, таких тут нынче не достаёт. Надеюсь на продолжение на тему ZF2 и Doctrine, сам ещё не успел их поковыять, но было бы интересно почитать про них.
Будет карма — будут ещё статьи. На эту тему и тему переводых технологий в веб разработки.
Спасибо за статью, но насчет ступенек не стоит забывать — если что-то где-то прибавляется, то где-то убывает (речь о производительности)…

Пожалуй исправьте:

$front = $this->getBootstrap()->getApplication()->getBootstrap()->getResource('frontcontroller');
Спасибо исправил.

Но не стоит забывать что и мощности серверов, которые не стоят на месте. Точно так же в коде всегда идёт работа по оптимизации кода. Вспомните когда PHP очень хорошо прибавило в производительности.
Какая интересная попытка приблизиться к Python…
PHP уже не торт :)
причём здесь Питон, вы думаете в других языках нет ОРМов? если проводить аналогии, тогда уже к Java — т.к. доткрина2 идеологически косит под Hibernate.
Пусть будет Java, верю вам, т.к. с Java не работал.
Но комментарий-то мой совсем не о том. PHP уверенно уходит от простоты к сложностям, на поле, где прочные позиции у других языков. И я не уверен, что такое движение на пользу PHP :(
А причем тут PHP? Речь идет о 2х фреймворках для PHP. По-моему это никак не отностися к самому языку.
Слышу звон, не знаю где он…
Пожалуйста, спрячьте больше информации под кат. Посмотрите на главную страницу: ваша статья занимает больше всех места. Очень не удобно просматривать хабр, особенно если читаешь с ноута (15,4").
Подправил. Первый пост на хабре — не всё так гладко.
if ($this->getBootstrap()->getEnvironment() == «development») {

!= наверное, таки :-) Или кэши поменять местами
Упс, я снова невнимателен :-( Я всегда пишу условия наоборот, на production
А что лежит в Core\Model\Entity?
Специфические для модели и всего приложения функции. Дефолтный модуль у меня называется Core.
Непонятно, что за метод getProperty вызывается и для чего он нужен
Это уже Функционал наследника. И это просто пример. Что и как совмещать, что бы было хорошо.
У увидел проблему и понял что будет много работы и кода, в конце оказалось что всё очень просто.
Doctrine 2 и ZF2 — прекрасны. Я прямо таки дождаться не могу когда они зарелизятся. И если насчет Doctrine 2 все более менее ясно (команда стремительно движется к релизу), то с ZF2 придется прилично подождать. Сейчас завершилась стадия перехода на неймспейсы, и по сути ZF2dev1 это — тот же ZF1 только с неймспейсами. Осенью будет последний релиз ветки 1.Х, и где-то в это же время станет точнее известна дата релиза второй версии (если вам интересны новости о ZF, подпишитесь на списки рассылки). Однако очень радует то, к чему команда стремится — упрощение фреймворка, разделение обязанностей, производительность, улучшение документации и другое.
Вообще для понимания преимуществ второй ветки фреймворков, было бы неплохо показать что было ДО, и сделать некоторые выводы.
Вообще для понимания топика, стоило бы прочитать его название.
Спасибо! Очень интересная статья. В своем новом проекте постараюсь воспользоваться вашими рекомендациями по интеграции. Если будете писать продолжение, то по возможности приведите пример более сложной модели с использованием data mapping по foreign keys, а если еще и про миграции в doctrine2 напишите будет вообще супер.
Можно чуть дополнить понравившеюся статью:
1. Использование PrePersist для автоматического выполнения того, что нужно:
Сразу после описания полей:
/** @PrePersist */
public function prePersist() {
$this->setCreatedAt(new \DateTime());
}
Пояснение: имеется поле $createdAt с типом (type=«datetime») при совершении записи в базу поле автоматически заполнится, как видно, текущим значением даты и времени.

2. Создание «связей» между таблицами: @OneToOne, @OneToMany, @ManyToMany.
Например самая простая связь:
* @Table(name=«notes»)

/**
* @OneToOne(targetEntity=«Entities\Clients»)
* @JoinColumn(name=«userId», referencedColumnName=«clientId»)
*/
private $Clients;
clientId — имя поля в таблице, с которой мы связываемся.
Это значит, что сущщность Notes будет иметь свойство Clients, а таблица «notes» «заимеет» поле userId, связанное с полем clientId в сущщности «Clients» и для того, чтобы увидеть, например, id клиента, которому пренадлежить даная запись нужно всего-то:
$this->note->getClients()->getClientId(); где note — экземпляр.

3. И, простите, еще капельку:
после выполнения запроса можно качественно гидрировать результат, т.е. получить:
getQuery()->[желаемый тип];
getResult() — массив объектов
getSingleResult() — один объект
getScalarResult() — массив результатов
есть и еще типы — посмотрите.

Спасибо за внимание.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории