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

Php Silex控制器上的构造函数注入,php,symfony,dependency-injection,silex,Php,Symfony,Dependency Injection,Silex,我在我的项目中使用silex,我添加了yml路由,在我的控制器操作中,我不希望每次都通过silex\Application。我只是想通过构造函数注入应用程序,我试着这样做 protected $_app; function __construct(Application $app) { $this->_app = $app; } 获取错误 可捕获的致命错误:传递给Smart\Controllers\IndexController::\uu construct

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

protected $_app;  

function __construct(Application $app) {      
    $this->_app =   $app;
}
获取错误

可捕获的致命错误:传递给Smart\Controllers\IndexController::\uu construct()的参数1必须是Silex\Application的实例,未给出任何实例

我如何解决这个问题?或者我如何实现安全注射,以便执行相同的操作?

您应该使用,这样您就可以将控制器用作服务。然后可以注入应用程序:

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

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

为了在构造函数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); } 受保护的函数createController($controller) { if(false==strpos($controller,:')){ 抛出新的\InvalidArgumentException(sprintf('找不到控制器“%s.”,$controller)); } 列表($class,$method)=分解(“::”,$controller,2); 如果(!class_存在($class)){ 抛出新的\InvalidArgumentException(sprintf('类“%s”不存在',$Class)); } 返回数组(新的$class($this->app),$method); } $app['resolver']=$app->share(函数()使用($app){ //试验 如果(isset($app['logger'])){ $logger=$app['logger']; }否则{ $logger=null; } $defaultResolver=新的ControllerResolver($logger); 返回新的decorcontrolleresolversymfony($defaultResolver、$app、$logger); }); 然后使用构造函数参数$app转到已创建的AbstractController

有关更多详细信息:


对不起,我说的是英语。

您可以在调用控制器时简单地将其作为参数传递,如下所示:

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

我正在使用yml路由提供,那么我如何才能像这样注入?@Nisam只有最后一行是您的路由配置。其他行是服务配置,您应该在PHP中进行配置
$app = new Silex\Application();
$app->mount('/test', new Test\TestController($app));