首页 > 解决方案 > Symfony 4 自动装配无法正常工作

问题描述

这是上下文:

  1. 使用 composer “composer require leezy/pheanstalk-bundle”安装 beanstalk 包

  2. 我正在尝试在命令中使用,但出现此错误

无法自动装配服务“App\Command\Worker\ProcessParserCommand”:方法“__construct()”的参数“$pheanstalk”引用接口“Pheanstalk\Contract\PheanstalkInterface”,但不
存在此类服务。您可能应该将此接口别名为现有的“leezy.pheanstalk.proxy.default”服务。

class ProcessParserCommand extends Command
{
    protected static $defaultName = 'app:worker:process-parser';

    /** @var PheanstalkInterface $pheanstalk */
    private $pheanstalk;

    protected function configure()
    {
        $this
            ->setDescription("Parse something")
        ;
    }



    public function __construct(PheanstalkInterface $pheanstalk)
    {
        $this->pheanstalk=$pheanstalk;

        parent::__construct();
    }
}

标签: symfonysymfony4beanstalkd

解决方案


事实证明,这是那些具有欺骗性的错误消息之一。

通常,当您收到“接口不存在,可能是别名 SomeService”消息时,这意味着需要将接口显式定义为别名:

# config/services.yaml
Pheanstalk\Contract\PheanstalkInterface:
    alias: 'leezy.pheanstalk.proxy.default'

但是在这种情况下,虽然这样做会让您通过接口错误,但会产生一个新的“构造函数参数太少”错误。

查看捆绑包的文档表明您需要进行一些配置才能实际生成 pheanstalk 实例。composer require 命令足够聪明,可以将包添加到您的 bundles.php 文件中,但不会创建配置文件。因此,根据文档添加配置文件:

# config/packages/leezy_pheanstalk.yaml
leezy_pheanstalk:
    pheanstalks:
       primary:
           server: beanstalkd.domain.tld
           default: true

并且很快。错误消失。作为奖励,不再需要 config/services.yaml 中的别名,如果您添加它,则应将其删除。


推荐阅读