正如标题所示,我希望基于HTTP主机名使用相同的控制器,但不同的视图。这可能吗?实现这一目标的最佳架构是什么?
如果控制器返回null,那么Symfony 2请求处理程序将调度一个KernelEvents::VIEW事件。
您可以为自己创建一个视图侦听器(http://symfony.com/doc/current/cookbook/service_container/event_listener.html)来捕获事件。然后,视图侦听器将需要逻辑来根据请求参数(如主机名)确定创建哪个视图。然后,视图将创建响应对象。然后监听器在事件中设置响应。
这是"最好"的方法吗?很难说。控制器本身没有理由不能创建视图。另一方面,通过视图监听器,你可以与多个控制器共享视图。这取决于你的应用。
下面是一个视图监听器的例子,它根据_format属性启动不同的视图。
namespace Cerad'Bundle'CoreBundle'EventListener;
use Symfony'Component'DependencyInjection'ContainerAware;
use Symfony'Component'HttpKernel'KernelEvents;
use Symfony'Component'HttpKernel'Event'GetResponseForControllerResultEvent;
use Symfony'Component'EventDispatcher'EventSubscriberInterface;
class ViewEventListener extends ContainerAware implements EventSubscriberInterface
{
const ViewEventListenerPriority = -1900;
public static function getSubscribedEvents()
{
return array(
KernelEvents::VIEW => array(
array('onView', self::ViewEventListenerPriority),
),
);
}
/* =================================================================
* Creates and renders a view
*/
public function onView(GetResponseForControllerResultEvent $event)
{
$request = $event->getRequest();
if ($request->attributes->has('_format'))
{
$viewAttrName = '_view_' . $request->attributes->get('_format');
}
else $viewAttrName = '_view';
if (!$request->attributes->has($viewAttrName)) return;
$viewServiceId = $request->attributes->get($viewAttrName);
$view = $this->container->get($viewServiceId);
$response = $view->renderResponse($request);
$event->setResponse($response);
}
# services.yml
cerad_core__view_event_listener:
class: '%cerad_core__view_event_listener__class%'
calls:
- [setContainer, ['@service_container']]
tags:
- { name: kernel.event_subscriber }
# routing.yml
cerad_game__project__schedule_team__show:
path: /project/{_project}/schedule-team.{_format}
defaults:
_controller: cerad_game__project__schedule_team__show_controller:action
_model: cerad_game__project__schedule_team__show_model_factory
_form: cerad_game__project__schedule_team__show_form_factory
_template: '@CeradGame'Project'Schedule'Team'Show'Twig'ScheduleTeamShowPage.html.twig'
_format: html
_view_csv: cerad_game__project__schedule_team__show_view_csv
_view_xls: cerad_game__project__schedule_team__show_view_xls
_view_html: cerad_game__project__schedule_team__show_view_html
requirements:
_format: html|csv|xls|pdf