Как загрузить файлы конфигурации компонентов Symfony, если не используется весь фреймворк?

#php #symfony

#php #symfony

Вопрос:

Я пытаюсь запустить простое приложение микросервисного типа с помощью маршрутизатора Symfony и компонента DI, но без использования symfony/skeleton пакета в качестве отправной точки.

Маршрутизация работает, а DI — нет. Глядя на документацию контейнера сервиса, неясно, как мое приложение будет фактически использовать config/services.yaml файл. Я не понимаю, когда он загружается, как он загружается и как бы я посоветовал Symfony использовать a services.php вместо этого?

Аналогично, если я устанавливаю новые пакеты composer, они загружают некоторые .yaml конфигурационные файлы config/packages/ . Должен ли я тогда загружать эти файлы вручную, используя config компонент?

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

1. Из любопытства: есть ли веская причина не использовать больше компонентов? Ручная реализация всего, что вам нужно, может потребовать больше работы, и я не думаю, что есть такой огромный прирост производительности

2. Под «дополнительными компонентами» вы подразумеваете просто создать мой микросервис как приложение Symfony? Я думаю, что недооценил кривую обучения использованию компонентов в автономном приложении.

3. Что касается последнего абзаца в вашем вопросе, любой пакет, который помещает файл в раздел config / packages, на самом деле является пакетом Symfony и специально разработан для использования внутри фреймворка Symfony. Итак, ответ таков: вы в принципе не сможете использовать эти конкретные пакеты. Конфигурация — большая часть фреймворка.

4. Если вы еще этого не сделали, я бы посоветовал прочитать о микроядре Symfony и, возможно, начать с него. По-прежнему использует пакет framework, но дает вам более или менее полный контроль над конфигурацией.

5. Просто хотел отметить, что ссылка DI в вашем вопросе указывает на документацию по платформе. Если вы хотите понять, как использовать DI standalone, тогда посмотрите документацию по компоненту DI .

Ответ №1:

Все это обычно происходит (в приложении Symfony) в ядре приложения, которое создается и загружается скриптом «front-controller» (например public/index.php ).

В ядре Symfony 5, поставляемом по умолчанию, вы найдете это:

 protected function configureContainer(ContainerConfigurator $container): void
{
    $container->import('../config/{packages}/*.yaml');
    $container->import('../config/{packages}/'.$this->environment.'/*.yaml');

    if (is_file(dirname(__DIR__).'/config/services.yaml')) {
        $container->import('../config/services.yaml');
        $container->import('../config/{services}_'.$this->environment.'.yaml');
    } elseif (is_file($path = dirname(__DIR__).'/config/services.php')) {
        (require $path)($container->withPath($path), $this);
    }
}
  

Это загружает все *.yaml файлы в config/packages каталогах и загружает файл, config/services.php но только если файл config/services.yaml не существует.

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

С уменьшенным объемом Symfony 5 создание собственного, вероятно, не особенно рентабельно, вы можете использовать минимальный symfony/skeleton , и у вас уже будет очень «микро» отправная точка, без необходимости тратить время на решение этих вещей.

Если вы настроены на «создание собственного», либо из-за особых требований, либо в качестве учебного упражнения, я рекомендую вам прочитать эту часть документации: Создайте свой собственный фреймворк PHP. Это очень полезный способ узнать, как многие части сочетаются друг с другом.

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

1. Я хочу создать отдельное PHP-приложение, а не приложение Symfony, и использовать компонент маршрутизации и внедрения зависимостей. Теперь я понимаю, что в этом случае мне пришлось бы вручную загружать файлы конфигурации. В случае компонента DI означает ли это, что я не могу просто ввести подсказку к классу в моем ie. метод конструктора, но сначала нужно вручную зарегистрировать их в контейнере? По крайней мере, это, кажется, предлагается здесь: symfony.com/doc/current/components/dependency_injection.html

2. вы можете использовать autowire просто отлично. вам просто нужно включить автозапуск, как описано здесь . Если вы не хотите определять каждую службу вручную, вы, вероятно, захотите load() использовать их, как показано здесь