简体   繁体   English

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

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

Like the title says, I would like to use the same controller, but different views, based on the HTTP host name. 就像标题所说的那样,我想基于HTTP主机名使用相同的控制器,但使用不同的视图。 Is this possible? 这可能吗? What would be the best architecture to accomplish it? 什么是实现它的最佳架构?

If the controller returns null then the Symfony 2 request handler will dispatch a KernelEvents::VIEW event. 如果控制器返回null,则Symfony 2请求处理程序将调度KernelEvents :: VIEW事件。

You can make yourself a view listener ( http://symfony.com/doc/current/cookbook/service_container/event_listener.html ) to catch the event. 您可以使自己成为视图侦听器( http://symfony.com/doc/current/cookbook/service_container/event_listener.html )以捕获事件。 Your view listener would then need the logic to determine which view to create based on request parameters such as the host name. 然后,您的视图侦听器将需要逻辑来根据请求参数(例如主机名)确定要创建哪个视图。 The view would then create the response object. 然后,该视图将创建响应对象。 The listener then sets the response in the event. 然后,侦听器在事件中设置响应。

Is this the "best" approach. 这是“最佳”方法吗? Hard to say. 很难说。 There is no reason why the controller itself could not create the view. 控制器本身没有理由不能创建视图。 On the other hand, with a view listener you can share views with multiple controllers. 另一方面,使用视图侦听器,您可以与多个控制器共享视图。 Really depends on your application. 真的取决于您的应用程序。

Here is an example of a view listener which kicks off different views depending on the _format attribute. 这是一个视图侦听器的示例,它根据_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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM