@startproger

Как задавать дополнительные свойства сущностям в Doctrine ORM?

Здравствуйте! До того, как я использовал какие-либо ORM, я костылял свои модели, и если после получения, например публикации, из модели, в контроллере, если мне надо задать ей дополнительно свойства (нужные только в контроллере и вьюхе, например ссылку), так и писал: $post->link = /blog/.$post->id

Теперь я использую Doctrine ORM, у которой свойства должны быть закрытыми, а сеттеры/геттеры для таких вещей (которые в базу не заносятся, только контроллер и вид) не надо делать.

Господа и дамы, как правильнее всего обходиться в данных случаях, если к каждому объекту для использования в контроллере и виде нужно добавлять какие либо свойства вроде link и чего то ещё что может мне понадобится?

p.s. использую Доктирну отдельно без Symfony в своём велосипеде.
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Теперь я использую Doctrine ORM, у которой свойства должны быть закрытыми, а сеттеры/геттеры для таких вещей (которые в базу не заносятся, только контроллер и вид) не надо делать.

Доктрине фиолетово на приватность/открытость ваших свойств, ровно как и на наличие методов для их
записи/чтения, кроме того этого сеттеры/геттеры распространены (абсолютно везде), но все равно это признак плохого кода, писал об этом статью на Хабре: Геттеры/сеттеры и проблема с инкапсуляцией.
А так Доктрина работает с объектами через рефлексию.

Как выводить нужные в другом слое данные, которые нужны для отображения, а не для бизнес-логики — DTO,
отвечал на днях: Что делать, если нужно получить часть данных сущности?

Если хотите работать с полем сущности, но не хотите чтобы оно загружалось из/в БД, то просто не делайте для этого поля аннотацию (или не указывайте его в yml, если используейте его для маппинга):

@Column
Marks an annotated instance variable as "persistent". It has to be inside the instance variables PHP DocBlock comment. Any value hold inside this variable will be saved to and loaded from the database as part of the lifecycle of the instance variables entity-class.
https://www.doctrine-project.org/projects/doctrine...


Итого:
Рекомендую или DTO или сервис (как указал BoShurik), который вернет ссылку, при том в этот сервис можно скормить роутер и создавать сылку не по названию сущности, а по названию роута — это облегчит потом смену сразу всех роутов одного типа, если не меняете название. А вообще и DTO и сервис нужны. В любом случае сущность знать о роутах ничего не должна, тем более этих роутов под одну сущность можеть быть куда больше, чем /blog/ и меняться это может довольно часто...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы