如何配置symfony2/3以处理服务于不同视图的不同域?
是否可以将symfony2/3配置为处理多个具有不同视图的域 例如,我有site1.com和site2.com,我会在app/Resources/views中创建site1和site2文件夹,并根据域提供不同的模板集 模型和控制器应该是共同的,因此site1.com/mypage和site2.com/mypage应该以不同的布局提供相同的内容 欢迎提出与此相关的任何建议或最佳实践如何配置symfony2/3以处理服务于不同视图的不同域?,symfony,Symfony,是否可以将symfony2/3配置为处理多个具有不同视图的域 例如,我有site1.com和site2.com,我会在app/Resources/views中创建site1和site2文件夹,并根据域提供不同的模板集 模型和控制器应该是共同的,因此site1.com/mypage和site2.com/mypage应该以不同的布局提供相同的内容 欢迎提出与此相关的任何建议或最佳实践 谢谢检查控制器中的主机: namespace Acme\FooBundle\Controller; use Sym
谢谢检查控制器中的主机:
namespace Acme\FooBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
class DemoController
{
public function showAction(Request $request)
{
switch($request->getHost())
{
case 'site1.com':
return $this->render('site1/show.html.twig');
break;
case 'site2.com':
return $this->render('site2/show.html.twig');
break;
default:
return $this->render('default/show.html.twig');
}
}
}
编辑:更通用的内容 创建onKernelRequest侦听器:
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class DomainRequestListener
{
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$host = explode('.',$request->getHost());
$request->request->attributes->set('_domain',$host[0]);
}
}
在services.yml中添加此侦听器:
app.listener.domain_request:
class: AppBundle\EventListener\DomainRequestListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest}
然后,您可以在所有控制器中使用“\u域”路由参数:
return $this->render($request->attributes->get('_domain').'/show.html.twig');
检查控制器中的主机:
namespace Acme\FooBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
class DemoController
{
public function showAction(Request $request)
{
switch($request->getHost())
{
case 'site1.com':
return $this->render('site1/show.html.twig');
break;
case 'site2.com':
return $this->render('site2/show.html.twig');
break;
default:
return $this->render('default/show.html.twig');
}
}
}
编辑:更通用的内容 创建onKernelRequest侦听器:
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class DomainRequestListener
{
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$host = explode('.',$request->getHost());
$request->request->attributes->set('_domain',$host[0]);
}
}
在services.yml中添加此侦听器:
app.listener.domain_request:
class: AppBundle\EventListener\DomainRequestListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest}
然后,您可以在所有控制器中使用“\u域”路由参数:
return $this->render($request->attributes->get('_domain').'/show.html.twig');
未经测试,但我希望以下各项能够正常工作。您需要注册一个内核请求侦听器,该侦听器使用细枝加载程序服务(负责定位模板)并基于请求的主机名注册路径 创建请求侦听器:
<?php
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class RegisterTwigPathSubscriber implements EventSubscriberInterface
{
private $loader;
public function __construct(\Twig_Loader_Filesystem $loader)
{
$this->loader = $loader;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'registerTwigPath'
];
}
public function registerTwigPath(GetResponseEvent $event)
{
$host = $event->getRequest()->getHost();
$path = '...'; // determine path based on hostname
$this->loader->addPath($path, 'Theme'); // the second argument is a namespace for templates located under this folder and can be chosen
}
}
services:
register_twig_path_listener:
class: RegisterTwigPathSubscriber
arguments: ["@twig.loader"]
tags: [{ name: kernel.event_subscriber }]
现在参考模板:
return $this->render('@Theme/path/to/actual/template.html.twig');
未经测试,但我希望以下各项能够正常工作。您需要注册一个内核请求侦听器,该侦听器使用细枝加载程序服务(负责定位模板)并基于请求的主机名注册路径 创建请求侦听器:
<?php
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class RegisterTwigPathSubscriber implements EventSubscriberInterface
{
private $loader;
public function __construct(\Twig_Loader_Filesystem $loader)
{
$this->loader = $loader;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'registerTwigPath'
];
}
public function registerTwigPath(GetResponseEvent $event)
{
$host = $event->getRequest()->getHost();
$path = '...'; // determine path based on hostname
$this->loader->addPath($path, 'Theme'); // the second argument is a namespace for templates located under this folder and can be chosen
}
}
services:
register_twig_path_listener:
class: RegisterTwigPathSubscriber
arguments: ["@twig.loader"]
tags: [{ name: kernel.event_subscriber }]
现在参考模板:
return $this->render('@Theme/path/to/actual/template.html.twig');
我不能在所有控制器中都这样做,我需要更通用的…
$request->get(“'u domain')
这段代码实际上很危险,因为这样可以在例如查询字符串中提供参数。如果在查询字符串中提供参数,它将在侦听器中被覆盖。不?这听起来合乎逻辑,但在代码中没有强制执行,所以这是一条危险的道路。最好使用请求属性:$request->attributes->set()和$request->attributes->get()我不能在所有控制器中都这样做,我需要更通用的…$request->get('u domain')
这段代码实际上很危险,通过这种方式,可以在例如查询字符串中提供参数。如果在查询字符串中提供参数,则它将在侦听器中被覆盖。不?这听起来合乎逻辑,但在代码中没有强制执行,所以这是一条危险的道路。最好是使用请求属性:$request->attributes->set()和$request->attributes->get()似乎部分工作,我只收到一个错误,说“my_folder”目录不存在,但实际上我在app/Resources/views中创建了该文件夹。我还做了一个测试,在src/AppBundle/resources/views中创建了相同的目录,但是运气不好,你能帮我吗?谢谢。您能给出具体的错误消息和堆栈跟踪吗?它太长了,但第一行是Filesystem.php第94行中的Twig_error_Loader:“my_folder”目录不存在。在Filesystem.php第94行中,最符合逻辑的解释是您注册的路径不存在。现在,我只放了一些类似于if($host=='mysite.com')$path='my_folder':我应该把我的_folder放在哪里?应用程序内/资源/视图?还是在AppBundle中?还是必须在某个常量后面附加$path?”因为我只是将文件夹名传递给addpath(),而不是完整路径。似乎它部分工作正常,我只收到一个错误,说“我的文件夹”目录不存在,但实际上我在app/Resources/views中创建了该文件夹。我还做了一个测试,在src/AppBundle/resources/views中创建了相同的目录,但是运气不好,你能帮我吗?谢谢。您能给出具体的错误消息和堆栈跟踪吗?它太长了,但第一行是Filesystem.php第94行中的Twig_error_Loader:“my_folder”目录不存在。在Filesystem.php第94行中,最符合逻辑的解释是您注册的路径不存在。现在,我只放了一些类似于if($host=='mysite.com')$path='my_folder':我应该把我的_folder放在哪里?应用程序内/资源/视图?还是在AppBundle中?还是必须在某个常量后面附加$path?”因为我只是将文件夹名传递给addpath(),而不是完整路径。