Symfony Controller магический метод?

Я пытаюсь использовать Symfony для репликации поведения в существующей платформе (Zikula). Этот фреймворк расширяется с помощью модулей, которые в основном являются расширенными симфоническими пакетами. Старые рамки были 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 (что я знаю, как сделать, у нас уже есть слушатели для других исключений).

Последняя проблема заключается в том, что создается впечатление, что пакет обслуживает ответ, когда он фактически обслуживается прослушивателем событий (или чем-то еще). Эта последняя часть важна, потому что другой контент в ответе должен поступать из модуля / пакета.

Я попытался изменить текущий слушатель на контроллер, а также попытался добавить метод к нашему расширению AbstractController от Symfony, но пока не достиг того, чего я надеюсь достичь. Я надеюсь на некоторые предложения о новых идеях или методах, чтобы попробовать.

2

Решение

Я отказался от попытки воспроизвести точное поведение, поскольку это кажется невозможным (это также довольно сложно описать). Таким образом, я прибег к обычному контроллеру со стандартным маршрутом, но я нашел способ заставить его казаться принадлежащим оригинальному модулю «хост». Спасибо Джерри, ggioffreda и DerStoffel за предложение идей.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]