2015-11-06 203 views
2

我有一個symfony項目與多個皮膚/模板有自己的路線,沒有人有一個正確的設置想法?Symfony,動態路由

  • 每個皮膚/模板都是它自己的包,因爲它不只是皮膚和資產,還可能是某些皮膚中可能存在的服務。
  • 主機名決定皮膚。
  • 使用自定義RouteLoader加載目標捆綁包的route.yml。

自定義的RouteLoader完成了這項工作 - 但生成的路由被緩存了,據我所知,沒有辦法阻止路由緩存。

提出了一些建議:

  • 創建/ {}動態路由,所以手動形成的路線。但是,我不想扔掉這一塊的路由器的功能,或者重構整個項目..
  • 使用模板標識符前綴路由。這將需要我加載所有route.yml文件,這是因爲他們的共享路徑,這是不可能的。

有人嗎?我真的不能去多個項目,皮膚的數量將在20-30左右。

此設置的原因是因爲其作爲Content-as-a-Service服務的目標,多個客戶端將該項目用作平臺,並且它們的設置決定使用哪個模板。

+0

這是你所需要的? HTTP:// symfony的。com/doc/current/components/routing/hostname_pattern.html – Flosculus

回答

1

這聽起來像你想動態加載基於主機名包?由於緩存,Symfony 2不會發生。特別是服務。

最好的辦法是爲每個皮膚設置一個應用程序,然後執行一些url majic來執行所需的app.php文件。顯然,既然你已經爲每個皮膚定義了一個捆綁包,那麼它的數量是有限的,所以擁有多個應用程序不應該太多或者是一個負擔。

您可能可以解決模板問題。你仍然需要加載所有的皮膚包,但是你可以使用模板名稱或路徑,並且可能會有一些工作。

但服務?除非您開始將主機名添加到服務ID,否則我沒有看到任何解決辦法。

+0

我認爲你是對的,太糟糕了。要去必須修復一些中間件,然後轉向每個模板項目。 –

+0

我認爲你可以製作在Symfony中使用Modular Routing,可以根據需要加載特定的路由:http://www.tomasvotruba.cz/blog/2016/02/25/modular-routing-in-symfony –

0

Symfony2中已經支持舉辦感知路由外的開箱,像這樣:

website_customer_1: 
    path: /
    host:  customer1.example.com 
    defaults: { _controller: Customer1Bundle:Main:startPage, theme: template1 } 

website_customer_2: 
    path: /
    host:  customer2.example.com 
    defaults: { _controller: Customer1Bundle:Main:startPage, theme: template2 } 
+0

我應該更清楚,對不起。用「主機名決定皮膚」,我的意思是:有一個數據庫關係,告訴哪個客戶使用哪個皮膚。因此,它需要ATLEAST 1個數據庫查詢找出哪些捆綁使用..有主機名和捆綁:( –

+0

我能真正解決這樣說,如果我使用的參數作爲主機選項之間沒有直接的聯繫,但我只需要動態填補這些參數 –

+0

那麼也許路由事件後,一個額外的聽衆會做的伎倆? 甚至你自己ControllerResolverListener?如果你duplcate所有控制器的客戶捆綁? – mblaettermann

0

我認爲可以通過在內核請求中添加偵聽器來根據用戶動態加載分枝模板。

我可以給你一段代碼,我希望它,可以幫助你:

 /** 
     * On Kernel Request triggers the request to get the user config 
     * then adds TWIG paths depending on user TemplateName 
     */ 
     public function onKernelRequest(GetResponseEvent $event) 
     { 
      if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { 
       return; 
      } 
      //$userConfig = Retrieve your user config 
      if (null === $userConfig->getTemplateConfig()->getTemplate()->getName()) 
      { 
       throw new TemplateConfigNotFoundException(sprintf("Could not find TemplateConfig for %s", $userConfig->getName())); 
      } 

      $template = $userConfig->getTemplateConfig()->getTemplate()->getName(); 

      $path = sprintf('%s/../../%s/Resources/views', __DIR__, ucfirst($template)); 

      if (!is_dir($path)) { 
       throw new TemplateNotFoundException(sprintf("Could not find template %s", $template)); 
      } 

      $this->loader->prependPath($path); 
      $this->loader->addPath(sprintf('%s/../Resources/views/Default', __DIR__)); 
     } 

隨着$這個 - >加載器定義爲\ Twig_Loader_Filesystem在Listener構造

希望它可以給你的線索