[英]same name function in different controller in symfony2 is not work in different path
[英]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.