Значение ** (и других символов) в глобальном шаблоне Symfony

#php #symfony #glob

#php #symfony #глобальный

Вопрос:

Несколько лет назад Symfony представила глобальные шаблоны для импорта и загрузки файлов конфигурации. Вы можете увидеть пример этого в стандартном классе ядра

 protected function configureRoutes(RouteCollectionBuilder $routes): void
{
    $confDir = $this->getProjectDir() . '/config';

    $routes->import($confDir . '/{routes}/*' . self::CONFIG_EXTS, '/', 'glob');
    $routes->import($confDir . '/{routes}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, '/', 'glob');
    $routes->import($confDir . '/{routes}' . self::CONFIG_EXTS, '/', 'glob');
}
  

Эти глобальные шаблоны расширяются, чтобы выглядеть следующим образом

 $routes->import("/path/to/symfony/config/{routes}/*.{php,xml,yaml,yml}", ...
$routes->import("/path/to/symfony/config/{routes}/dev/**/*.{php,xml,yaml,yml}", ...
$routes->import("/path/to/symfony/config/{routes}.{php,xml,yaml,yml}", ...
  

Это наводит на несколько вопросов. Прежде всего — что такое ** шаблон? Это не стандартная часть синтаксиса PHP glob. Я предполагаю, что по контексту это означает «все в этой папке и всех подпапках», но я не могу найти официальные документы по синтаксису Symfony glob, чтобы знать наверняка.

Другие вещи в шаблонах странные — например {routes} . Обычно вы заключаете объекты в фигурные скобки, когда хотите сопоставить список — но здесь используются фигурные скобки только с одним элементом в списке, что заставляет меня думать, что я не понимаю, что происходит?

Когда я углубляюсь в исходный код, задействованные методы являются большими и не самыми интуитивно понятными для понимания.

Является ли синтаксис Symfony glob реализацией стандартного синтаксиса glob? Или это его собственная функция, и если да, то какие дополнительные функции у него есть помимо стандартных подстановочных знаков? (регулярные выражения? более специальные вещи, такие как ** ? означает ли что-нибудь одно слово в фигурной скобке?)

Комментарии:

1. Это аналогично Bash с включенной globstar опцией. Итак, /path/to/symfony/config/{routes}/dev/**/*.{php,xml,yaml,yml} перейдем к dev каталогу и затем проведем поиск во всех подкаталогах для *.php , *.xml и т.д.

2. Полезно, спасибо @miken32!