我有什么:
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
,我想知道为什么会发生错误。
答案 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,有一个不错的教程。