当前位置: 首页 > 知识库问答 >
问题:

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

通学真
2023-03-14

我试图在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_oauth_server.client_manager.default”服务或别名已被删除或内联。您应该将其公开,或者停止直接使用容器,改用依赖项注入。

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

共有2个答案

丁曦
2023-03-14

您需要检查/bin/console debug:autowiring命令的输出,以获得适当的接口,以便在构造函数中使用“fos\u oauth\u server.client\u manager.*”。应已设置自动布线,以允许容器识别并从那里插入。

这将需要对SF4的FosOauthServer支持,并且在构造函数中还记得调用parent::\uu construct()以正确设置命令。您可以这样做,但仍然可以使用containerWareCommand来-

薄涵衍
2023-03-14

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

您应该避免将整个contanier注入到您的服务中(或通过扩展containerwarecommand来插入命令)。相反,您应该只注入所需的服务:

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.中配置具有适当依赖性的AppOauClientCreateCommand

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

希望这有帮助。

 类似资料:
  • 3.3 自定义命令 命令语法 定义命令与定义映射的用法其实很相似: :command {lhs} {rhs} 只不过在使用自定义命令时,{lhs} 是直接输入到命令行中的,当你按下回车时,vim 就将 {lhs} 替换为 {rhs} 再执行。所以这在形式上与下面这个映射等效: : nnoremap :{lhs}<CR> :{rhs}<CR> 当然,由于 :command 所支持的参数与 :ma

  • 问题内容: 我有一个名为“ example”的库,该库正在安装到我的全局site- packages目录中。但是,我希望能够安装两个版本,一个用于生产版本,一个用于测试版本(我有一个Web应用程序,而其他东西也都以这种方式进行了版本化)。 有没有一种方法可以指定,例如“ python setup.py stage”,它不仅可以将其他鸡蛋安装到站点程序包中,还可以将模块从“ example”重命名为

  • 假设我需要一个新的git命令gitnew,它生成一个新分支,该分支与origin/master是最新的。 是否有一种方法可以使此脚本在powershell的Windows上的所有存储库中都可用? 编辑:为了澄清我想要一个git脚本,而不是一个PowerShell函数。我提到PowerShell的唯一原因是因为我不使用git bash。

  • 应用服务启动可以在多个地方进行调整,以下介绍两种方案,Dockerfile 和 平台详情页调整 Dockerfile CMD启动方式 看一下简单的例子: FROM hub.kpaas.nsini.com/app/hello:v0.0.3 CMD ["/go/bin/hello"] 启动命令写在CMD这个后面,如果后面有多个参数可以以逗号隔开例如: CMD ["static-web", "-pa

  • 经过之前编章的介绍,我们知道在 Python 中,常见的容器类型有: dict, tuple, list, string。其中也提到过可容器和不可变容器的概念。其中 tuple, string 是不可变容器,dict, list 是可变容器。 可变容器和不可变容器的区别在于,不可变容器一旦赋值后,不可对其中的某个元素进行修改。当然具体的介绍,可以看回之前的文章,有图文介绍。 那么这里先提出一个问题

  • 是否可以使用用户扩展在Selenium IDE中创建自定义命令.js并使其能够将自身更改为自定义导出格式,如果是这样,如何? 我将使用SeleniumIDE记录测试,这些测试将以完全自定义的Java格式导出,作为全自动测试系统的一部分运行。格式不是JUnit,而是每个测试都是它自己的类,并根据整个系统的输入动态加载。 我想要做的是在Selenium IDE中创建一个名为“take snapshot