Задать вопрос

Как правильно реализовать вычисляемое поле для Entity (Symfony/Doctrine)?

Добрый день. Осваиваю Symfony/Doctrine.

Есть entity User с полем subdomain:
class User
{
    // ...

    // тут значение домена третьего уровня
    private $subdomain;

    public function setSubdomain($subdomain)
    {
        $this->subdomain = $subdomain;
    }
    
    public function getSubdomain()
    {
        return $this->subdomain;
    }

    // ...
}


Есть конфиг:
acme:
    full_domain_template: http://{subdomain}.example.com


Хотелось бы на entity User иметь метод getFullDomain(), который бы на основе конфига и поля subdomain формировал значение полного домена.

Вижу следующее решение: создавать User через фабрику, которая будет инжектить в него значение из конфига. Но решение кажется не очень удачным.

Кто как решает данную проблему? Возможно методу getFullDomain() вообще не место на Entity, тогда где?
  • Вопрос задан
  • 808 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Есть несколько вариантов решения.

1) грязным хаком получать контейнер и извлекать из него нужные сервисы и параметры. Если нужно решить очень быстро, то можно сделать и так, но тогда потом не забыть прибрать за собой, как появится время на рефакторинг.
2) сделать фабрику для создания сущности (как вы и говорили)
Эти два варианта можно посмотреть вот в этом вопросе.

3) Передать шаблон через параметр метода:
class User
{
    // ...

    public function getFullDomain($template)
    {
        return str_replace("{subdomain}", $this->subdomain, $template);
    }
}

Но код, который использует эту сущность, должен сам получать шаблон, чтобы передать в метод getFullDomain().

4) Сделать расширение для Twig. Решение в зависимости от назначения этого метода - если полное имя домена выводится только в представлении, то это хороший выход. В приведённой странице документации приведён способ построения фильтра user|fullDomain, но не сложнее сделать и функцию - fullDomain(user), кому что больше нравится.

5) Сделать сервис, который будет строить полное имя домена. Это самый универсальный способ, ведь во всех остальных случая можно вызвать этот сервис и использовать его метод для построения имени.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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