2015-06-09 59 views
3

我使用Symfony2的一個網站,我想有這取決於用戶的完全不同的路由文件(IP地址,...)動態更改路由器文件的Symfony2

我的第一個想法就是加載不同環境如果用戶的功能,但內核(所以環境設置)設置在事件之前,我認爲這個解決方案不能工作。

我想保持相同的URL,在其他網站沒有重定向...

如果您有任何想法,謝謝:)

回答

4

您可以創建額外的裝載機,這將擴展您現有的裝載機,如documentation。你的情況:

<?php 


namespace AppBundle\Routing; 

use Symfony\Component\Config\Loader\Loader; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Routing\RouteCollection; 

class AdvancedLoader extends Loader 
{ 
    private $request; 

    public function __construct(Request $request) 
    { 
     $this->request = $request; 
    } 

    public function load($resource, $type = null) 
    { 
     $collection = new RouteCollection(); 

     $ip = $this->request->getClientIp(); 

     if($ip == '127.0.0.1'){ 
      $resource = '@AppBundle/Resources/config/import_routing1.yml'; 
     }else{ 
      $resource = '@AppBundle/Resources/config/import_routing2.yml'; 
     } 

     $type = 'yaml'; 

     $importedRoutes = $this->import($resource, $type); 

     $collection->addCollection($importedRoutes); 

     return $collection; 
    } 

    public function supports($resource, $type = null) 
    { 
     return 'advanced_extra' === $type; 
    } 
} 

的appbundle /資源/配置/ services.yml

services: 
    app.routing_loader: 
     class: AppBundle\Routing\AdvancedLoader 
     arguments: [@request=] 
     tags: 
      - { name: routing.loader } 

應用程序/配置/ routing.yml中

app_advanced: 
    resource: . 
    type: advanced_extra 
+1

它的工作原理,但該路由直接添加到緩存中,但可以使用http://symfony.com/doc/current/cookbook/configuratio禁用緩存N/apache_router.html – Ajouve

0

你可以使用PHP文件作爲主路由器,然後根據根據您的條件(用戶,IP,...),您可以加載動態路由或加載單個路由文件。

去通過http://symfony.com/doc/current/book/routing.html你可以設置你的路由是這樣的:

# app/config/config.yml 
framework: 
    # ... 
    router: { resource: "%kernel.root_dir%/config/routing.php" } 

在routing.php文件可以導入靜態文件(YML,XML),或者只登記路線,直接出現(這一切根據你的具體情況)。