找不到服务:即使服务存在于应用程序的容器中

时间:2019-05-27 12:33:40

标签: symfony4

我有什么:

services.yaml

app.foo.bar:
    class: App\Foo\Bar
    arguments: #[ ... ]

控制器:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller
{
    public function baz(Request $request)
    {
        $this->get('some_bundle.some_service');
    }
}

它有效。

但是不建议使用Symfony\Bundle\FrameworkBundle\Controller\Controller,我尝试扩展Symfony\Bundle\FrameworkBundle\Controller\AbstractController并得到

  

找不到服务“ some_bundle.some_service”:甚至   尽管它存在于应用程序的容器中,   “ App \ Controller \ MyController”是一个较小的服务定位器   只知道“教义”,“ http_kernel”,“ parameter_bag”,   “ request_stack”,“ router”,“ serializer”和“ session”服务。尝试   而是使用依赖项注入。

我可以将get()AbstractController一起使用吗? AbstractController使用ControllerTrait,我想知道为什么会发生错误。

1 个答案:

答案 0 :(得分:0)

与以前的版本相比,symfony4中发生了很多变化。您正在使用所有内容,就像在以前的版本中一样。快速解决方案不是“首选”方法,但是开始时可以将services.yaml文件中的public键从默认的false更改为true

更好的方法是将其保留为私有,而改用依赖项注入。服务的名称也已更改(现在只是服务的路径)。请参阅文档here。对于您的代码,请尝试以下操作:

// services.yaml

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    App\Foo\Bar:
        tags: { ** }

以及带有依赖注入的控制器:

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class MyController extends AbstractController
{
    public function baz(Request $request, Bar $bar)
    {
        $bar->doSomething();
    }
}

关于这些东西(还有更多)here,有一个不错的教程。