Как Doctrine2 устанавливает значения идентификаторов

#php #doctrine-orm

#php #doctrine-orm

Вопрос:

У меня есть вопрос из любопытства о внутренней работе Doctrine2. Я, как пользователь, вижу действительно чистый и надежный интерфейс, но под капотом должна быть какая-то тяжелая магия.

Когда я создаю простую сущность, она выглядит примерно так:

 class SimpleEntity
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORMColumn(type="string")
     */
    protected $title;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set title
     *
     * @param string $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * Get title
     *
     * @return string 
     */
    public function getTitle()
    {
        return $this->title;
    }
}
  

Как вы заметите, одна вещь явно отсутствует, нет способа установить идентификатор, но, тем не менее, фабрики doctrines возвращают объекты с установленными идентификаторами. Как это может работать? Я попытался просмотреть исходный код, но где-то потерял трек.

Как можно перезаписать защищенные значения, не находясь в иерархии классов?

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

1. Может быть, есть что-то в @ORM аннотациях. Я думаю, что именно здесь происходит волшебство.

2. Аннотации дают doctrine точку входа через отражение, но способно ли отражение устанавливать значения? Это даже противоречило бы названию…

Ответ №1:

Ответ таков Отражение. Смотрите http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/getting-started-xml-edition.html#a-first-prototype

Не углубляясь в источник Doctrine, я бы сказал, что он использует ReflectionProperty::setValue()

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

1. @Phil — Я бы так не сказал, вероятно, просто незнание.

2. @Phil Вы определяете класс с защищенными / частными свойствами, и язык фактически дает вам способы доступа и изменения их извне… Эти функции, как правило, используются слишком многими разработчиками.

3. @Floyd Threepwood Еще немного почитать здесь — en.wikipedia.org/wiki/Reflection_ (компьютерное программирование)