是否可以配置symfony2/3處理多個不同視圖的域?如何配置symfony2/3來處理服務於不同視圖的不同域?
例如我有site1.com和site2.com,我會在app/Resources/views內創建一個site1和site2文件夾,並根據域提供一組不同的模板。
模型和控制器應該是共同的,因此site1.com/mypage和site2.com/mypage應該爲不同的佈局提供相同的內容。
與此相關的任何建議或最佳實踐是值得歡迎的。
感謝
是否可以配置symfony2/3處理多個不同視圖的域?如何配置symfony2/3來處理服務於不同視圖的不同域?
例如我有site1.com和site2.com,我會在app/Resources/views內創建一個site1和site2文件夾,並根據域提供一組不同的模板。
模型和控制器應該是共同的,因此site1.com/mypage和site2.com/mypage應該爲不同的佈局提供相同的內容。
與此相關的任何建議或最佳實踐是值得歡迎的。
感謝
沒有測試,但我希望下面的應該工作。您需要註冊一個使用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');
檢查在你的控制器主機:
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}
然後你可以使用在所有的控制器的「_domain」路由參數:
return $this->render($request->attributes->get('_domain').'/show.html.twig');
我不能做到這一點在所有的控制器,我需要更通用的東西... – user3174311
'$ request-> get('_ domain')'這段代碼實際上是危險的,因爲這個該參數可以在例如查詢字符串中提供。 – Gerry
如果它在查詢字符串中提供,它將在偵聽器中被覆蓋。不是? – Alsatian
看起來有點偏袒,我只會得到一個錯誤,說「my_folder」目錄不存在,但我實際上在app/Resources/views中創建了該文件夾。我也做了一個測試,在src/AppBundle/resources/views中創建相同的目錄,但沒有運氣,你能幫我解決嗎?謝謝。 – user3174311
你能給出具體的錯誤信息和堆棧跟蹤嗎? – Gerry
它太長,但第一行是 Filesystem.php中的Twig_Error_Loader 94行: 「my_folder」目錄不存在。文件系統中的 。php line 94 – user3174311