在Silex中创建子请求后不再存在变量(Symfony2)

时间:2015-08-24 15:43:01

标签: symfony silex

我有这个问题,我试图在Silex中创建一个子请求,并基本上将我的参数转发给另一个控制器。 图表A 在下面(尝试重构后)中断,图表B (原始版本)有效:

附件A (创建请求后$this->app丢失):

class EntriesController {
    private $app;
    private $req;

    public function __construct($app, $req) {
        $this->app = $app;
        $this->req = $req;      
    }

    public function updateAction() {
        //...

            //$url defined here (eyesore-ingly long, so not shown)
            $subRequest = Request::create($url, 'GET', $params,  $this->req->cookies->all(), array(), $this->req->server->all());
            //$this->app **no longer** exists here
            return $this->app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
        }
    }

EntriesController实例创建如下:

class AppControllerProvider implements ControllerProviderInterface {
    public function connect(Application $app) {     
        $controllers = $app['controllers_factory'];

        //...

        $controllers->patch('/edit', function (Request $req) use ($app) {
            $entriesCtrl = new \EntriesController($app, $req);
            return $entriesCtrl->updateAction();                
        });

        //...
}

图表B (效果很好):

 class AppControllerProvider implements ControllerProviderInterface {
    public function connect(Application $app) {     
        $controllers = $app['controllers_factory'];

        $controllers->patch('/edit', function (Request $req) use ($app) {
            //...

            //$url defined here
            $subRequest = Request::create($url, 'GET', $params,  $this->req->cookies->all(), array(), $this->req->server->all());    
            return $this->app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
        }

        //...       
    });

我基本上只是将 Exhibit B 'PATCH' /edit方法体中的逻辑重新组织成一个控制器类,然后我将Silex应用程序实例$app传递给了一个新的实例控制器类。

1 个答案:

答案 0 :(得分:1)

据我所知,Exhibit A和Exhibit B之间的唯一区别是你在路径方法回调中实例化一个控制器对象。也许这个控制器的设置方式或名称空间问题有问题?乱射'在黑暗中。

我可以确认在我的silex应用程序中,以下代码生成null $ app容器:

GlobalControllerProvider.php

<?php

namespace Dev\Pub\Provider\Controller;

use Silex\Application;
use Silex\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request;

class GlobalControllerProvider implements ControllerProviderInterface
{
    public function connect(Application $app)
    {
        $controllers = $app['controllers_factory'];

        $controllers
            ->get('/', 'Dev\Pub\Controller\GlobalController::indexAction')
            ->bind('homepage')
        ;

        $controllers
            ->patch('/edit', function (Request $req) use ($app) {
                $entriesCtrl = new \Dev\Pub\Controller\GlobalController();
                return $entriesCtrl->updateAction($app, $req);
        });

        return $controllers;
    }
}

GlobalController.php

<?php

namespace Dev\Pub\Controller;

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class GlobalController
{
    public function indexAction(Application $app, Request $request)
    {
        return new Response($app['twig']->render('index.html.twig'));
    }

    public function updateAction(Application $app, Request $request)
    {
        $url = 'http://silex.local/index_dev.php/'; 
        $params = array();
        $subRequest = Request::create($url, 'GET', $params,  $request->cookies->all(), array(), $request->server->all());

        // outputs: 'Silex\Application'
        error_log(print_r(get_class($app),1).' '.__FILE__.' '.__LINE__,0); 

        // outputs: 1
        error_log(print_r(is_object($app),1).' '.__FILE__.' '.__LINE__,0);  

        return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
    }
}

index.main.js

$(function(){
    console.log('index.main.js');

    $.ajax({
        url: "http://silex.local/index_dev.php/edit",
        method: "PATCH"
    }).done(function( data ) {
        console.log(data);
    }).fail(function( data ) {
        console.log(data);
    });

});