如何配置symfony2/3以处理服务于不同视图的不同域?

如何配置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

是否可以将symfony2/3配置为处理多个具有不同视图的域

例如,我有site1.com和site2.com,我会在app/Resources/views中创建site1和site2文件夹,并根据域提供不同的模板集

模型和控制器应该是共同的,因此site1.com/mypage和site2.com/mypage应该以不同的布局提供相同的内容

欢迎提出与此相关的任何建议或最佳实践


谢谢

检查控制器中的主机:

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(),而不是完整路径。