Symfony 使用构造函数参数将请求转发到另一个控制器
在另一个控制器中调用Symfony 使用构造函数参数将请求转发到另一个控制器,symfony,Symfony,在另一个控制器中调用handle转发请求时,是否可以传递构造函数参数?还是有不同的方法?目前,我得到下面的错误。我没有看到任何例子 service.xml <services> <service id="my_api.controller.abstract" abstract="true"> <argument type="service" id="security.token_storage"/> </service&g
handle
转发请求时,是否可以传递构造函数参数?还是有不同的方法?目前,我得到下面的错误。我没有看到任何例子
service.xml
<services>
<service id="my_api.controller.abstract" abstract="true">
<argument type="service" id="security.token_storage"/>
</service>
<service id="my_api.controller.receiver"
class="My\Bundle\Order\ApiBundle\Controller\ReceiverController"
parent="my_api.controller.abstract">
<argument type="service" id="my_api.service.api"/>
</service>
<service id="my_api.controller.sender"
class="My\Bundle\Order\ApiBundle\Controller\SenderController"
parent="my_api.controller.abstract">
<argument type="service" id="http_kernel"/>
</service>
</services>
发送控制器
/**
* @Route("/receiver", service="my_api.controller.receiver")
*/
class ReceiverController extends AbstractController
{
private $apiService;
public function __construct(
TokenStorageInterface $tokenStorage,
AaServiceInterface $aService
) {
parent::__construct($tokenStorage);
$this->apiService = $apiService;
}
/**
* @param Request $request
*
* @Secure(roles="ROLE_ADMIN")
*
* @Route("/order/{id}", requirements={"id"="([0-9]){8}"})
*
* @return Response
*/
public function givItToMeAction(Request $request)
{
$result = $this->apiService->call(
$this->getUser(),
$request->getPathInfo(),
$request->getMethod(),
$request->query->all(),
$request->getContent()
);
return new Response($result);
}
}
/**
* @Route("/sender", service="my_api.controller.sender")
*/
class ReceiverController extends AbstractController
{
private $httpKernel;
public function __construct(
TokenStorageInterface $tokenStorage,
HttpKernelInterface $httpKernel
) {
parent::__construct($tokenStorage);
$this->httpKernel = $httpKernel;
}
/**
* @param Request $request
*
* @Secure(roles="ROLE_ADMIN")
*
* @Route("/order/{id}", requirements={"id"="([0-9]){8}"})
*
* @return Response
*/
public function takeItAction(Request $request)
{
$attributes = [
'_controller' => 'MyOrderApiBundle:Receiver:givItToMeAction',
'request' => $request
];
$subRequest = $request->duplicate($request->query->all(), null, $attributes);
return $this->httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
}
}
由于您的控制器已注册为服务,因此您必须使用与配置路由时使用的控制器相同的表示法。这意味着,您不应该使用MyOrderRapiBundle:Receiver:GivitToAction而应该使用my_api.controller.Receiver:GivitToAction错误已更改,因此它表明我们走上了正确的道路。新错误<代码>{“error”:{“code”:0,“message”:“Controller\”my\u api.Controller.receiver:PassipDomainRequest\”for URI\“\/sender\/order\/123456\”是不可调用的。}}如果您将控制器用作服务,那么您需要使用实际的方法名,并在末尾加上
Action
。您比我快了一步。我刚刚就这样把它分类了。
/**
* @Route("/sender", service="my_api.controller.sender")
*/
class ReceiverController extends AbstractController
{
private $httpKernel;
public function __construct(
TokenStorageInterface $tokenStorage,
HttpKernelInterface $httpKernel
) {
parent::__construct($tokenStorage);
$this->httpKernel = $httpKernel;
}
/**
* @param Request $request
*
* @Secure(roles="ROLE_ADMIN")
*
* @Route("/order/{id}", requirements={"id"="([0-9]){8}"})
*
* @return Response
*/
public function takeItAction(Request $request)
{
$attributes = [
'_controller' => 'MyOrderApiBundle:Receiver:givItToMeAction',
'request' => $request
];
$subRequest = $request->duplicate($request->query->all(), null, $attributes);
return $this->httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
}
}