我在我的项目中使用了silex,我添加了yml路由,在我的控制器操作中,我不希望每次都传递Silex\Application
。我只想通过构造函数注入Application,我试过这样,
protected $_app;
function __construct(Application $app) {
$this->_app = $app;
}
收到错误
捕获致命错误:传递给Smart \ Controllers \ IndexController :: __ construct()的参数1必须是Silex \ Application的实例,没有给出
我该如何解决这个问题?或者如何实现安全注射呢?
答案 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));