По сути, идея заключается в том, что ваш Command
описывает, какие сервисы он будет использовать в своем конструкторе, поэтому, если вам нужен только UserManager
, он будет выглядеть примерно так:
class MyCommand extends Command
{
private $userManager;
public function __construct(UserManager $userManager)
{
// Make sure to call the parent constructor
parent::__construct(null);
$this->userManager = $userManager;
}
// ...
}
Консоль Symfonyничего не говорит о создании службы, потому что это не является его обязанностью, это то, для чего предназначен Контейнер службы (который является частью компонента внедрения зависимостей) в типичном приложении Symfony, и вы можетеиспользуйте его также, но, возможно, в вашем маленьком инструменте CLI это может быть излишним.
Простой способ
У вас bin/console.php
(или его эквивалент) вы можете создавать все службы при добавлениикоманда как это:
use Symfony\Component\Console\Application;
$application = new Application();
$userManager = new UserManager(...);
$application->add(new MyCommand($userManager));
$application->run();
Менее легкий подход
Как вы можете себе представить, это может стать довольно утомительным и раздражающим, особенно если вам нужны разные конфигурации. Вы можете использовать автономный контейнер службы и сделать так, чтобы он считывал конфигурацию службы (в основном представление всего материала между $app = new Application()
и $app->run()
:
$containerBuilder = new ContainerBuilder();
$loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__));
$loader->load('config.yaml');
// ...
$containerBuilder->compile();
См. Документы для Компиляция контейнера .
Альтернативный подход
Если вы хотите сохранить код для создания всех этих сервисов и не хотите контейнер, вы можете вместо этого создавать Factory-классы, которые создают ваш UserManager (когда егонеобходимо вместо создания всех сервисов заранее):
$application = new Application();
$userManagerFactory = new UserManagerFactory() ;
$application->add($userManagerFactory->createUserManager());
$application->run();
Вы также можете использовать другие контейнеры вместо контейнера Symfony, если считаете, что настройка и компиляция слишком сложны. Например, существует очень легкий массив на основерешение под названием Pimple, которое лучше подходит для вашего случая использования, или вы можете использовать одну из многих других библиотек.
tl; dr
Создание служб не входит в обязанности компонента консолиследовательно, это не объясняется. Есть много разных подходов с разными плюсами / минусами,g создание экземпляров сервисов только при необходимости против конфигурации, необходимой для получения контейнера (или подобного контейнеру объекта для хранения ваших сервисов).