2015-09-06 3 views
1

У Laravel была такая функция, как Global Patterns (described here).Symfony Routing: Как определить глобальные требования/ограничения для подстановочных знаков?

Концепция вкратце: вы можете определить шаблон для подстановочного знака один раз, например, Route::pattern('id', '[0-9]+') и использовать подстановочный знак {id} в своих шаблонах маршрутов, не повторяя себя.

Теперь, я пытаюсь интегрировать компонент symfony/routing в свою домашнюю рамочку. Я вижу, что шаблоны подстановочных знаков могут быть определены с использованием An array of requirements (described here) для каждого маршрута, и я не могу найти способ объявить их глобально.

Есть ли такая/подобная функция в symfony/routing?

ответ

1

Если вы работаете над своим фреймворком, вы сможете в конечном итоге собрать все свои маршруты (\Symfony\Component\Routing\Route() объектов) в RouteCollection (\Symfony\Component\Routing\RouteCollection() объект). Это могут быть маршруты, определенные вашей каркасной или прикладной программой на основе вашей инфраструктуры.

Это, в основном, что вам нужно сделать, чтобы соответствовать вашим URI с помощью \Symfony\Component\Routing\Matcher\UrlMatcher().

Теперь RouteCollection может выполнить любые требования и добавить их ко всем маршрутам в коллекции.

Таким образом, все, что вам нужно сделать, это:

Определите globalrequirements во всяком случае, в любом месте вы хотите, но в конце концов, добавить их к конечному коллекции маршрутов, например:

$globalRequirements = [ 
    'any' => '.*', 
    'id' => '[0-9]+', 
    'ident' => '[A-Za-z0-9]+', 
    'date' => '[0-9]{4}-[0-9]{2}-[0-9]{2}', 
    'year' => '[0-9]{4}', 
]; 

/** @var RouteCollection $routes */ 
$routes->addRequirements($globalRequirements); 

просто!

Примечание: Все существующие requirements с таким же именем, как year, будут переписаны в этом случае. Поэтому вам нужно будет добавить какую-то пользовательскую логику, если вы хотите ее избежать.

+0

Спасибо, это сработало для меня! – SmxCde

0

Вы не можете объявлять шаблоны подстановок глобально. Но вы могли бы сделать что-то вроде этого:

  1. Declare контроллер в качестве службы
  2. Создание объекта маршрута
  3. Присвоить маршрут к контроллеру в бассейне

Читать это должно дать вам лучше выглядеть http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html http://symfony.com/doc/current/components/dependency_injection/tags.html http://symfony.com/doc/current/components/dependency_injection/compilation.html

Затем вы можете создать что-то вроде загрузчика и в этом загрузчике, когда вы загружаете настроенные службы контроллера, добавьте в свои действия настраиваемое определение маршрута.

Что-то вроде этого:

общественная функция нагрузки ($ ресурс, $ типа = NULL) { $ маршруты = новый RouteCollection();

foreach ($this->pool->getControllers() as $controllerKey => $controller) { 
      $route = new Route($pattern, $defaults, $requirements, $options, $host, $schemes, $methods, $condition); 
      $routes->add($controllerKey . '.' . $actionKey, $route); 
    } 

    return $routes; 
} 

Его единственный пример, чтобы вы могли понять, как создать экземпляр маршрута.

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