代码之家  ›  专栏  ›  技术社区  ›  misha

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

  •  1
  • misha  · 技术社区  · 6 年前

    我正在尝试在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()));
       }
    }
    

    尝试运行此命令时出现以下错误

    编译容器时,“fos\u oauth\u server.client\u manager.default”服务或别名已被删除或内联。你应该
    将其公开,或者停止直接使用容器,改用依赖注入。

    我如何公开供应商服务,或者我在命令配置中遗漏了什么?

    2 回复  |  直到 6 年前
        1
  •  3
  •   VladRia    6 年前

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

    您应该避免将整个contanier注入服务(或通过扩展 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 如果没有自动连线,则必须配置 AppOauthClientCreateCommand 在您的服务中具有适当的依赖性。亚马尔。类似于:

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

    希望这有帮助。

        2
  •  1
  •   Alister Bulman    6 年前

    您需要检查 ./bin/console debug:autowiring 使用“fos\u oauth\u服务器”的相应接口的命令输出。client\u manager。*'在构造函数中。自动布线应该已经设置好,以便容器能够识别并从那里插入。

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