Есть несколько вариантов решения.
1) грязным хаком получать контейнер и извлекать из него нужные сервисы и параметры. Если нужно решить очень быстро, то можно сделать и так, но тогда потом не забыть прибрать за собой, как появится время на рефакторинг.
2) сделать фабрику для создания сущности (как вы и говорили)
Эти два варианта можно посмотреть вот
в этом вопросе.
3) Передать шаблон через параметр метода:
class User
{
// ...
public function getFullDomain($template)
{
return str_replace("{subdomain}", $this->subdomain, $template);
}
}
Но код, который использует эту сущность, должен сам получать шаблон, чтобы передать в метод getFullDomain().
4)
Сделать расширение для Twig. Решение в зависимости от назначения этого метода - если полное имя домена выводится только в представлении, то это хороший выход. В приведённой странице документации приведён способ построения фильтра user|fullDomain, но не сложнее сделать и функцию - fullDomain(user), кому что больше нравится.
5) Сделать сервис, который будет строить полное имя домена. Это самый универсальный способ, ведь во всех остальных случая можно вызвать этот сервис и использовать его метод для построения имени.