我有这样的树:
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并且不知道我错过了什么。
先谢谢
答案 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);
...