автоконфигурировать команды без тегов с symfony инъекцией зависимостей - PullRequest
0 голосов
/ 03 мая 2020

У меня есть cli-проект, в котором я использую компоненты Symfony Dependency Injection и Console. Я не использую ядро, контроллеры и т. Д. c.

При использовании autoconfigure: true служба не получает тег console.command, который должен.

Мой composer. json:

{
  "require": {
    "php": "^7.4",
    "monolog/monolog": "^2.0",
    "symfony/console": "^5.0",
    "symfony/dependency-injection": "^5.0",
    "symfony/config": "^5.0",
    "symfony/yaml": "^5.0"
  },
  "autoload": {
    "psr-4": {"Mudder\\": "src/"}
  }
}

. / Config / services.yaml:

services:
  _defaults:
    autowire: true
    autoconfigure: true

  Mudder\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
    public: true

. / Src / Mudder / Command / HelloWorld. php:

<?php

namespace Mudder\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class HelloWorld extends Command
{
    protected static string $defaultName = 'test';

    protected function configure()
    {
        $this->setDescription('Foo');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Hello, world.');
        return 0;
    }
}

Наконец, ./test.php (точка входа в cli):

<?php

require __DIR__ . '/vendor/autoload.php';

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

$containerBuilder = new ContainerBuilder();

$loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__ . '/config'));
$loader->load('services.yaml');
$containerBuilder->compile();

print_r($containerBuilder->getDefinition(\Mudder\Command\HelloWorld::class)->getTags());

Выход из print_r () - пустой массив "Array () «

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Сам контейнер ничего не знает о Команде.

Если вы хотите автоматически настроить ваши команды, вам нужно вызвать

$containerBuiler->registerForAutoconfiguration(Command::class)->addTag('console.command');

или загрузить FrameworkExtension (из symfony FrameworkBundle)

0 голосов
/ 03 мая 2020

Ваша команда должна заканчиваться Команда . Переименуйте его в HelloWorldCommand .

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