Php Symfony2-基于HTTP主机使用相同的控制器但不同的视图?
正如标题所说,我希望基于HTTP主机名使用相同的控制器,但不同的视图。这可能吗?实现它的最佳体系结构是什么?如果控制器返回null,那么Symfony 2请求处理程序将调度一个KernelEvents::VIEW事件 您可以使自己成为一个视图侦听器()来捕获事件。然后,视图侦听器需要逻辑根据请求参数(如主机名)确定要创建的视图。然后,视图将创建响应对象。然后,侦听器在事件中设置响应 这是“最佳”方法吗。很难说。控制器本身没有理由不能创建视图。另一方面,通过视图侦听器,您可以与多个控制器共享视图。这取决于你的申请 下面是一个视图侦听器的示例,它根据_format属性启动不同的视图Php Symfony2-基于HTTP主机使用相同的控制器但不同的视图?,php,symfony,Php,Symfony,正如标题所说,我希望基于HTTP主机名使用相同的控制器,但不同的视图。这可能吗?实现它的最佳体系结构是什么?如果控制器返回null,那么Symfony 2请求处理程序将调度一个KernelEvents::VIEW事件 您可以使自己成为一个视图侦听器()来捕获事件。然后,视图侦听器需要逻辑根据请求参数(如主机名)确定要创建的视图。然后,视图将创建响应对象。然后,侦听器在事件中设置响应 这是“最佳”方法吗。很难说。控制器本身没有理由不能创建视图。另一方面,通过视图侦听器,您可以与多个控制器共享视图。
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