Silex控制器上的构造函数注入

时间:2013-12-11 06:26:29

标签: php symfony dependency-injection silex

我在我的项目中使用了silex,我添加了yml路由,在我的控制器操作中,我不希望每次都传递Silex\Application。我只想通过构造函数注入Application,我试过这样,

protected $_app;  

function __construct(Application $app) {      
    $this->_app =   $app;
}

收到错误

  

捕获致命错误:传递给Smart \ Controllers \ IndexController :: __ construct()的参数1必须是Silex \ Application的实例,没有给出

我该如何解决这个问题?或者如何实现安全注射呢?

3 个答案:

答案 0 :(得分:2)

您应该使用ServiceControllerServiceProvider,因此您可以将控制器用作服务。然后你可以注入应用程序:

$app = new \Silex\Application();
$app['controller.index'] = function () use ($app) {
    return new \Smart\Controllers\IndexController($app);
};

$app->get('/', "controller.index:indexAction");

答案 1 :(得分:0)

为了在构造函数baseController中注入$ app,我创建了一个symfony的装饰器controllerResolver:

DecoratorControllerResolverSymfony中的重载方法createController扩展了Symfony \ Component \ HttpKernel \ Controller \ ControllerResolve

protected function createController($controller)
    {
        if (false === strpos($controller, '::')) {
            throw new \InvalidArgumentException(sprintf('Unable to find controller "%s".', $controller));
        }
        list($class, $method) = explode('::', $controller, 2);
        if (!class_exists($class)) {
            throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
        }
        return array(new $class($this->app), $method);
    }
$app['resolver'] = $app->share(function () use ($app) {

            //test
            if(isset($app['logger'])){
                $logger = $app['logger'];
            }else{
                $logger = null;
            }

            $defaultResolver = new ControllerResolver($logger);

            return new DecoratorControllerResolverSymfony($defaultResolver, $app, $logger);
        });

然后使用构造函数参数$ app

创建AbsractController

了解更多详情:https://github.com/nagi88/silex-skeleton-mvc-module

抱歉我的英文。

答案 2 :(得分:0)

您可以在调用控制器时简单地将其放入,并将其作为参数传递:

$app = new Silex\Application();
$app->mount('/test', new Test\TestController($app));