动态更改路由器文件Symfony2

时间:2015-06-09 13:49:12

标签: php symfony

我有一个使用Symfony2的网站,我希望有一个完全不同的路由文件,具体取决于用户(IP地址,...)

我的第一个想法是加载一个不同的环境,如果用户的功能,但内核(所以环境设置)是在事件之前设置的,我认为这个解决方案无法工作。

我希望保留相同的网址,不要在其他网站上重定向...

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

2 个答案:

答案 0 :(得分: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 :(得分: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)或直接在那里注册路由(所有这些都根据您的具体情况而定)。