2015-06-09 4 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 } 

приложение/Config/routing.yml

app_advanced: 
    resource: . 
    type: advanced_extra 
+1

Он работает, но маршрут напрямую добавляется в кеш, но вы можете отключить кеш с помощью http://symfony.com/doc/current/cookbook/configuratio н/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) или просто зарегистрировать маршруты прямо там (все это на основе ваших конкретных условий).

Смежные вопросы