Теперь я использую 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/
и меняться это может довольно часто...