Консоль Symfony: запутался в услугах - PullRequest
2 голосов
/ 11 октября 2019

Я использую Symfony Console в качестве автономного средства для создания приложения CLI.

Документация Symfony Console ясна, когда дело касается сервисов. Может кто-нибудь дать мне практический пример того, как это работает?

Например, в ваших документах:

Я действительно запутался!

Например, пример в разделе «Получение служб из контейнера служб»показывает пример $this->userManager->create($input->getArgument('username'));

Но это не показывает меня. как создать этот магический класс userManager, который имеет функцию create?

Если я создаю userManager в качестве стандартной команды, то я не вижу, как я могу создать подфункции, учитывая, что SymfonyКонсоль имеет только три жизненных цикла? initialize(), interact() и execute()

1 Ответ

4 голосов
/ 11 октября 2019

По сути, идея заключается в том, что ваш 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 создание экземпляров сервисов только при необходимости против конфигурации, необходимой для получения контейнера (или подобного контейнеру объекта для хранения ваших сервисов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...