在Symfony 4.2中,不赞成使用Controller类,并且您应该切换到AbstractController,因此,除了为您定义的一些服务之外,不再有权使用$this->get('service.name')
功能
我的基本控制器扩展了Symfony的Controller,并具有利用$this->get
功能的功能:
public function getRepository($repository){
$repo = $this->get($repository);
if($this->authRepository !== null) {
$repo->setPrefix($this->authRepository);
}
return $repo;
}
因此,在控制器中,我可以说类似$this->getRepository('api.service');
之类的内容,然后它将加载我的服务,根据请求设置前缀,然后返回已配置的api.service。
借助新的AbstractController和服务的自动装配/自动注入功能,我如何才能告诉服务不仅调用setPrefix方法(我知道我可以做到),还可以告诉它在控制器中使用参数? / p> 到目前为止的配置:
api.service:
class: App\ApiService
calls:
- method: setPrefix
arguments:
- '??????'
答案 0 :(得分:0)
因此,您在上面发布的这种方法:
public function getRepository($repository){
$repo = $this->get($repository);
if($this->authRepository !== null) {
$repo->setPrefix($this->authRepository);
}
return $repo;
}
可以使用新的DependecyInjection这样实现:
class TestController extends AbstractController
{
/**
* @Route("/test", name="test")
*/
public function test(App\ApiService $service)
{
$service->maybeSetPrefix($service);
$service->call(...
}
// this can go into your own BaseController
public function maybeSetPrefix($service)
{
if ($this->authRepository !== null) {
$service->setPrefix($this->authRepository);
}
}
}
您将不需要,因为Symfony DependencyInjection应该已经自动连接了它,但是手动将其看起来像这样:
App\ApiService:
autowire: true
autoconfigure: true
public: false
因此,我们现在不再使用api.service
之类的服务ID,而是完全合格的类名App\ApiService
。
如果您仍然希望通过api.service
使服务可引用,则可以另外添加别名服务定义:
api.service:
alias: App\ApiService
public: true
但是也许在您的情况下,您可以让App\ApiService
根据请求而不是由控制器来决定如何初始化自身,就像这样:
class ApiService
{
public function __construct(RequestStack $requestStack, AuthRepository $authRepository)
{
$request = $requestStack->getCurrentRequest();
if ($request->get('option') === 'test') {
$this->setPrefix($authRepository);
}
}
如果这样做没有帮助,请发布一些更多详细信息或当前Controller逻辑的示例代码。