#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()
использовать их, как показано здесь