簡體   English   中英

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM