Symfony 3 服务未找到异常

Symfony 3 service not found exception

我有一棵这样的树:

src
`-- AppBundle  
    |-- AppBundle.php   
    |-- Controller   
    |   `-- MyController.php  
    `-- Service         
        `-- MyStringService.php

现在我想像这样在 "MyController" 中使用服务 "MyStringService":

<?php

namespace AppBundle\Controller;

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\Constraints\Date;
use Symfony\Component\VarDumper\Cloner\Data;

class MyController extends Controller 
{
    public function usernameAction(Request $request, $username)
    {
        $data = $this->get('my_string_service')->getString($username);
        return $this->render('profile.html.twig', $data);
    }
}

让我们看一下服务,它基本上什么都不做:

<?php

namespace AppBundle\Service;

class MyStringService 
{

    public function getString($string)
    {
        return $string;
    }

}

这样我就可以通过我的 services.yml:

中的 ID 调用它
services:
    my_string_service:
        class: AppBundle/Service/MyStringService

当我使用 php bin/console debug:container my_string_service 时,我得到:

Information for Service "my_string_service"
===========================================

 ---------------- ----------------------------------- 
  Option           Value
---------------- ----------------------------------- 
  Service ID       my_string_service                  
  Class            AppBundle/Service/MyStringService  
  Tags             -                                  
  Public           no                                 
  Synthetic        no                                 
  Lazy             no                                 
  Shared           yes                                
  Abstract         no
  Autowired        yes                                
  Autoconfigured   yes
---------------- ----------------------------------- 

现在,当我启动服务并打开页面 localhost:8000/localhost:8000/MyUsername 时,我得到一个 ServiceNotFoundException

所以现在我刚开始使用 symfony,不知道我错过了什么。

提前致谢

输出中的关键项是Public no

默认情况下,在全新安装的 Symfony 中,服务是私有的,目的是将它们用作依赖项而不是从容器中获取(因此,通过构造函数进行类型提示,或使用一些额外的配置,在 ControllerAction 中)。

您可以在 services.yml 文件中将该服务声明为 public: true,或者(更好,长期),开始在构造函数中定义它们:

<?php
namespace AppBundle\Service;

use AppBundle\Service\MyStringService

class MyStringService 
{
    private $strService;

    public function __constructor(MyStringService $strService)
    {
        $this->strService = $strService;
    }

    public function getString($string)
    {
        $data = $this->strService->getString($username);
        return $this->render('profile.html.twig', $data);
        ...

有关于 service_container page 的文档。