2016-09-04 37 views
0

是否可以配置symfony2/3處理多個不同視圖的域?如何配置symfony2/3來處理服務於不同視圖的不同域?

例如我有site1.com和site2.com,我會在app/Resources/views內創建一個site1和site2文件夾,並根據域提供一組不同的模板。

模型和控制器應該是共同的,因此site1.com/mypage和site2.com/mypage應該爲不同的佈局提供相同的內容。

與此相關的任何建議或最佳實踐是值得歡迎的。

感謝

回答

1

沒有測試,但我希望下面的應該工作。您需要註冊一個使用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'); 
+0

看起來有點偏袒,我只會得到一個錯誤,說「my_folder」目錄不存在,但我實際上在app/Resources/views中創建了該文件夾。我也做了一個測試,在src/AppBundle/resources/views中創建相同的目錄,但沒有運氣,你能幫我解決嗎?謝謝。 – user3174311

+0

你能給出具體的錯誤信息和堆棧跟蹤嗎? – Gerry

+0

它太長,但第一行是 Filesystem.php中的Twig_Error_Loader 94行: 「my_folder」目錄不存在。文件系統中的 。php line 94 – user3174311

1

檢查在你的控制器主機:

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'); 
+0

我不能做到這一點在所有的控制器,我需要更通用的東西... – user3174311

+0

'$ request-> get('_ domain')'這段代碼實際上是危險的,因爲這個該參數可以在例如查詢字符串中提供。 – Gerry

+0

如果它在查詢字符串中提供,它將在偵聽器中被覆蓋。不是? – Alsatian

相關問題