Как загрузить роутинги сразу из нескольких файлов?

Возникла задача загружать роутинги сразу из файлов в разных директориях.
В документации есть пример, который показывает, как искать файл в нескольких директориях один файл, а потом доставать оттуда роутинги:
$fileLocator = new FileLocator(array(__DIR__));
$loader = new YamlFileLoader($fileLocator);
$routes = $loader->load('routes.yaml');


А как сделать, чтобы доставать файлы из разных директорий, а потом с ними работать?
Устроено примерно так:
data/
├── dir1
│ └── routes.yaml
├── dir2
│ └── routes.yaml
...

Т.е. нужно взять все файлы routes.yaml из указаных папок, и там уже искать роутинги

Реально ли такое сделать?
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Если вы знаете расположение конфигов, то можно так:
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Routing\RouteCollectionBuilder;

require_once __DIR__.'/../vendor/autoload.php';

$locator = new FileLocator([__DIR__.'/../data']);
$loader = new YamlFileLoader($locator);

$builder = new RouteCollectionBuilder($loader);
$builder->import('dir1/routes.yaml');
$builder->import('dir2/routes.yaml');

$routes = $builder->build();
var_dump($routes);


Если расположение конфигов неизвестно или вы просто не хотите заморачиваться при добавлении новых:
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Routing\Loader\GlobFileLoader;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Routing\RouteCollectionBuilder;

require_once __DIR__.'/../vendor/autoload.php';

$locator = new FileLocator([__DIR__.'/../data']);
$resolver = new LoaderResolver([
    new GlobFileLoader($locator), // needs symfony/finder
    new YamlFileLoader($locator),
]);
$loader = new DelegatingLoader($resolver);

$builder = new RouteCollectionBuilder($loader);
$builder->import('**/*/routes.yaml', '/', 'glob');

$routes = $builder->build();
var_dump($routes);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы