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 的文档。
我有一棵这样的树:
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 的文档。