Doctrine 2: аксессоры, мутаторы, fromArray(), toArray()

Всем хороша новая Doctrine, вот только нет там многих удобных функций, решающих повседневные проблемы. В этой статье я расскажу о том, как можно сделать Doctrine 2 более комфортной для разработки.

Основное нововведение Doctrine 2 в том, что классы моделей (entities) теперь ни от кого не наследуются. А значит нет функций, добавляемых раньше через Doctrine_Record. Особенно сбивает с толку отсутствие аксессоров и мутаторов для свойств модели. Я поначалу создавал их вручную, но потом понял, что лучше сделать один раз и качественно доступ к свойствам модели. Итак вот пошаговое руководство. Проверено на Doctrine 2.2

  1. Создаём класс DoctrineExtra\ORM\DomainObject.php (содержание файла ниже).
  2. Наследуем все классы модели от него.
  3. Обозначаем все свойства модели как public. Возможно лучше будет сделать их protected.
  4. Теперь вам становятся доступны аксессоры, мутаторы, функции fromArray() и toArray(). Причём toArray() работает рекурсивно по связям модели.

DoctrineExtra\ORM\DomainObject.php

Обратите внимание, что в процессе загрузки (bootstrap) в реестр (Zend_Registry) должен добавляться entityManager.
Удачного вам кодинга!

Ссылки

Implementing ArrayAccess for Domain Objects

15 Comments

    1. С удовольствием узнаю о других способах. Какие есть идеи?

  1. Fatal error: Cannot use object of type Entity\Student as array in /home/horoshev/www-data/kurs/www/app/Entity/Base.php on line 133

  2. Не работает рекурсивная сериализация

    просто нет никаких вложенных элементов

    смущает вот этот кусок кода

    $key_id = $fmKey.”_id”;
    108.$tmpMergedMappings[$key_id] = $this->$key_id->id;

    у меня внешние ключи имеют другой формат названия (совпадающий с названием праймари кея в присоединяемой таблице)

    1. Хм, у меня вроде работала. На досуге надо будет ещё разок протестить.

  3. А вот это вообще странный код.

    Это вообще проверялось?

    public function toArrayDirectly()
    {
    return get_object_vars($this);
    }

    данная штука просто вывалит ВСЕ свойства объекта, включая совсем неимеющие отношения к данным свойства. Добавленные уже самой доктриной.

    1. Да, она делает именно это. Потом либо разбирать их по маппингу модели, либо по другому получать 🙂

  4. “Теперь вам становятся доступны аксессоры, мутаторы, функции fromArray() и toArray(). Причём toArray() работает рекурсивно по связям модели.”

    Вот еще интересно на какую глубину. Ведь приналичии двухсторнних связей вы легко получите бесконечную рекурсию.

    Статья содержит связь с Коментариями.

    Каждый Комментарий имеет связь со Статьей.

    Предположим мы сериализуем в массив статью рекурсивно, также сериализуем всее ее комментарии, котрые в свою очередь содержат статью, содержащую этиже комментарии …. и так бесконечно.

    Я вижу выход только в том чтобы явно указывать какие связи для данной сущьности мы будем раскрывать.

    1. Да, обработки циклических ссылок нет. Хорошая идея указывать раскрываемые сущности или глубину связей.

Leave a Reply to Андрей Токарчук Cancel reply