Я пытаюсь использовать Symfony для воспроизведения поведения в существующей структуре (зикула). Эта структура расширяема с помощью модулей, которые в основном представляют собой расширенные пакеты симфонии. В старой структуре были такие URL-адреса
index.php?module=foo&type=bar&func=zip
что на языке symfony примерно переводится как
index.php?bundle=foo&controller=bar&method=zip
В фреймворке есть AbstractController, у которого есть волшебный метод, например:
public function __call($method, $args)
{
$event = new \Zikula\Core\Event\GenericEvent($this, array('method' => $method, 'args' => $args));
$this->eventManager->dispatch('controller.method_not_found', $event);
if ($event->isPropagationStopped()) {
return $event->getData();
}
}
поэтому, если вы создали URL-адрес с методом, которого не было в пакете, вы можете создать прослушиватель для его захвата и отправки ответа, который выглядит и ведет себя так, как будто он пришел из указанного пакета . Мы используем это для вызова модульных служб, которые доступны для всех модулей и предоставляются в отдельном модуле, но выглядят так, как будто они обслуживаются модулем «хост».
Теперь я пытаюсь воспроизвести это, используя symfony и маршрутизацию.
первая проблема заключается в создании маршрута, который технически не существует. Это возможно?
Вторая проблема — перехват RouteNotFoundException (что я умею делать, у нас уже есть слушатели для других исключений).
Последняя проблема заключается в том, что создается впечатление, что пакет обслуживает ответ, хотя на самом деле его обслуживает прослушиватель событий (или что-то еще). Эта последняя часть важна, потому что другой контент в ответе должен исходить из модуля/пакета.
Я попытался изменить текущий слушатель на контроллер, а также попытался добавить метод к нашему расширению symfony AbstractController, но еще не достиг того, чего я надеюсь достичь. Я надеюсь на некоторые предложения по новым идеям или методам, чтобы попробовать.