Symfony 4 自定义容器感知命令错误

Symfony 4 custom container aware command error

我正在尝试在 Symfony 4 项目中创建自定义命令

class AppOauthClientCreateCommand extends ContainerAwareCommand
{

   protected function configure()
   {
     $this
        ->setName('app:oauth-client:create')
        ->setDescription('Create a new OAuth client');
   }

   protected function execute(InputInterface $input, OutputInterface $output)
   {
    $clientManager = $this->getContainer()->get('fos_oauth_server.client_manager.default');
    $client = $clientManager->createClient();
    $client->setAllowedGrantTypes(array(OAuth2::GRANT_TYPE_USER_CREDENTIALS));
    $clientManager->updateClient($client);

    $output->writeln(sprintf('client_id=%s_%s', $client->getId(), $client->getRandomId()));
    $output->writeln(sprintf('client_secret=%s', $client->getSecret()));
   }
}

当我尝试运行这个命令时出现以下错误

The "fos_oauth_server.client_manager.default" service or alias has been removed or inlined when the container was compiled. You should either
make it public, or stop using the container directly and use dependency injection instead.

如何制作供应商服务 public 或者我是否在命令配置中遗漏了什么?

您将需要检查 ./bin/console debug:autowiring 命令的输出以获得适当的接口,以便在构造函数中使用 'fos_oauth_server.client_manager.*'。应该已经设置了自动装配以允许容器识别并从那里插入它。

这将需要 FosOauthServer 支持 SF4 - 并且在构造函数中记得还要调用 parent::__construct(); 以正确设置命令。您可以这样做并仍然使用 ContainerAwareCommand ->get() 容器中的其他东西 - 但随着时间的推移您可能会离开它。

问题是自 Symfony 4 以来,所有服务默认都是私有的。事实上,使用服务容器的 get 方法无法获得私有服务。

您应该避免在您的服务中注入整个容器(或通过扩展 ContainerAwareCommand 命令)。相反,您应该只注入所需的服务:

class AppOauthClientCreateCommand
{
   /**
    * @var ClientManagerInterface
    */
   private $clientManager;

   public function __construct(ClientManagerInterface $clientManager)
   {
       $this->clientManager = $clientManager;
   }

   protected function configure()
   {
       ...
   }

   protected function execute(InputInterface $input, OutputInterface $output)
   {
        $client = $this->clientManager->createClient();
        ...
   }
}

如果 ClientManagerInterface 未自动装配,则您必须在 services.yaml 中配置具有适当依赖性的 AppOauthClientCreateCommand。类似于:

services:
    App\Command\AppOauthClientCreateCommand:
        arguments:
            $clientManager: "@fos_oauth_server.client_manager.default"

希望对您有所帮助。