2015-07-29 2 views
6

Фон: Я хочу изменить самозаписываемое расширение Twig. Класс определяется следующим образом:Как узнать, какие параметры имеют маршрут в php

class pagination extends \Twig_Extension { 
    protected $generator; 

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

    .... 
} 

В одном из методов, я хочу, чтобы генерировать URL, как это:

$this->generator->generate($route, array('routeParam' => $value); 

Но проблема в том, что некоторые маршруты не имеют параметров «routeParam», который g выдает исключение при создании маршрута таким образом.

Мой вопрос: как я могу узнать, имеет ли данный маршрут определенные параметры в этом методе?

+2

Если вы генерировать URL, используя свой пример маршрута, который не требует параметра его нужно просто добавить его в '$ _GET' строку как'/вашего/URL? RouteParam = value'. – qooplmao

ответ

6

Чтобы проверить маршрут имеет все Params, нужно составить свой маршрут, чтобы маршрут скомпилировать вам нужно маршрутизатор службу, чтобы передать @service_container обслуживание вашего расширения прута, добавив в своем определении сервиса

somename.twig.pagination_extension: 
    class: Yournamesapce\YourBundle\Twig\Pagination 
    arguments: [ '@your_generator_service','@service_container' ] 
    tags: 
     - { name: twig.extension } ... 

и в вашем class get container, затем получите сервис маршрутизатора из контейнера и получите все маршруты по getRouteCollection(), как только у вас есть все маршруты, вы получите нужный маршрут для сбора по $routes->get($route), затем скомпилируйте этот маршрут, как только у вас будет заданное определение маршрута, вы можете получить все параметры, необходимые для маршрута, вызывающий getVariables(), который будет возвращать массив параметров и до генерации проверки в массиве if routeParam существует

use Symfony\Component\DependencyInjection\ContainerInterface as Container; 
class Pagination extends \Twig_Extension { 
    protected $generator; 
    private $container; 
    public function __construct($generator,Container $container){ 
     $this->generator = $generator; 
     $this->container = $container; 
    } 

    public function somefunction(){ 
     $routes = $this->container->get('router')->getRouteCollection(); 
     $routeDefinition = $routes->get($route); 
     $compiledRoute = $routeDefinition->compile(); 
     $all_params = $compiledRoute->getVariables(); 
     if(in_array('routeParam',$all_params)){ 
      $this->generator->generate($route, array('routeParam' => $value); 
     } 
    } 
    .... 
} 
+1

Это точно решило проблему. Спасибо – Benjamin