Symfony现有公共服务抛出错误消息"您已请求不存在的服务"

时间:2017-10-04 14:07:20

标签: symfony service

我开始使用Symfony中的服务,因此从symfony文档创建了示例服务:

namespace AppBundle\Service;

use Psr\Log\LoggerInterface;

class MessageGenerator
{
  private $logger;
  public function __construct(LoggerInterface $logger){

  }
    public function getMessage()
    {
        $this->logger->info('Success!');
    }
}

我在我的控制器中调用该服务(我也有使用声明: :use AppBundle\Service\MessageGenerator;

  $messageGenerator = $this->get(MessageGenerator::class);
  $message = $messageGenerator->getMessage();
  $this->addFlash('success', $message);

我的服务在services.yml文件中定义:

    app.message_generator:
    class: AppBundle\Service\MessageGenerator
    public: true

所以在我看来,我完全按照文档中所描述的那样做了所有事情并且在调用时:

    php app/console debug:container app.message_generator

在我的命令行中,我得到了我的服务:

  Option             Value                               
 ------------------ ------------------------------------ 
  Service ID         app.message_generator               
  Class              AppBundle\Service\MessageGenerator  
  Tags               -                                   
  Scope              container                           
  Public             yes                                 
  Synthetic          no                                  
  Lazy               no                                  
  Synchronized       no                                  
  Abstract           no                                  
  Autowired          no                                  
  Autowiring Types   -   

现在,当我执行控制器功能时,我会调用我的服务,但仍然会收到错误:

You have requested a non-existent service "appbundle\service\messagegenerator".

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

Symfony在命名方面有点令人困惑:您通过其定义的名称app.message_generator请求服务来检索服务。

 $messageGenerator = $this->get('app.message_generator');

答案 1 :(得分:1)

Symfony最近建议从您定义服务的名称(app.message_generator)切换到类名(AppBundle\Service\MessageGenerator)。他们都只是一个名字'打电话给服务。

当仅定义给定名称时,您尝试使用两者。

从长远来看,它建议使用基于::class的名称,并且很可能允许框架自己查找类,并自行配置它们。这意味着,默认情况下,所有服务都是私有的,并由框架&它的服务容器。

与此同时,在学习的过程中,您可以:

$messageGenerator = $this->get('app.message_generator');

或定义明确定义服务,并将其公开,以便可以从容器中使用->get(...)获取它。

# services.yml
AppBundle\Service\MessageGenerator:
    class: AppBundle\Service\MessageGenerator
    public: true

# php controller
$messageGenerator = $this->get(MessageGenerator::class);

或仅在请求时自动注入控制器

public function __construct(LoggerInterface $logger, MessageGenerator $msgGen)
{
    $this->messageGenerator = $msgGen;
}

public function getMessage()
{
    $result = $this->messageGenerator->do_things(....);
    $this->logger->info('Success!');
}