Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 使用构造函数参数将请求转发到另一个控制器_Symfony - Fatal编程技术网

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);
    }
}