Symfony2 -基于HTTP主机使用相同的控制器但不同的视图


Symfony2 - Use same controller but different view based on HTTP host?

正如标题所示,我希望基于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