没有发现Symfony 3服务异常

时间:2017-10-10 10:18:21

标签: php symfony symfony-3.3

我有这样的树:

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并且不知道我错过了什么。

先谢谢

1 个答案:

答案 0 :(得分:3)

输出中的关键项是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上有文档。