Symfony - Использование шаблона дизайна посетителя внутри сущности для вызова правильного метода обслуживания - PullRequest
0 голосов
/ 13 декабря 2018

Вот довольно специфический вопрос о хороших / плохих практиках Symfony.Моя проблема в том, что в зависимости от класса объекта у меня разные логики для одного и того же действия.У меня вопрос: можно ли реализовать шаблон проектирования посетителей и передать службу Symfony в качестве параметра метода сущностей?

Пример:

/**
 * Some service
 */
class Visitor {
    public function visitA(EntityA $entity)
    {
        ... some logic ...
    }

    public function visitB(EntityB $entity)
    {
        ... some different logic ...
    }
}

/**
 * @ORM\Entity
 */
class EntityA
{
    public function accept(Visitor $visitor)
    {
        $visitor->visitA($this);
    }
}

/**
 * @ORM\Entity
 */
class EntityB
{
    public function accept(Visitor $visitor)
    {
        $visitor->visitB($this);
    }
}

Мой вопрос просто и просто узнатьесли такая структура будет хорошей практикой в ​​Symfony?Поскольку представляется более естественным, что субъекты не должны знать об услугах ... А если нет, то каким будет приемлемый обходной путь?

1 Ответ

0 голосов
/ 14 декабря 2018

Для меня лучшее решение - это перенести метод accept из сущностей во внешнюю Службу, например:

 /**
 * Some service
 */
 class Visitor { 

 public function accept($entity){

     switch (true) {
        case $entity istanceof EntityA:
            //some logic;

        case $entity istanceof EntityB:
            //some other logic;

        default:
            new \Exception('invalid class');
    }
}
...