2013-12-11 60 views
2

我使用的是我的項目中的silex表單,我添加了yml路由,在我的控制器操作中,我不想每次都傳遞Silex\Application。我只是想通過構造函數注入應用,我想這樣的,Silex控制器上的構造函數注入

protected $_app; 

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

得到錯誤

Catchable Fatal Error: Argument 1 passed to Smart\Controllers\IndexController::__construct() must be an instance of Silex\Application, none given

我怎樣才能解決這個問題?或者我怎樣才能達到安全注射的目的呢?

回答

2

您應該使用ServiceControllerServiceProvider,因此您可以將控制器用作服務。然後,你可以注入應用:

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

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

正在使用陽明路由提供,那我怎麼才能注入這樣的..? – Nisam

+0

@Nisam只有最後一行是你的路由配置。其他行是服務配置,你應該在PHP中這樣做。 –

0

對於構造baseController注入$應用程序,我創建的symfony的裝飾controllerResolver:

在DecoratorControllerResolverSymfony

重載方法createController延伸的Symfony \分量\ HttpKernel \控制器\ 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); 
     }); 

然後去創造AbsractController與構造函數的參數$應用

更多細節:https://github.com/nagi88/silex-skeleton-mvc-module

對不起,我的英語水平。

0

你可以簡單地把它當你打電話給你的控制器,並把它作爲參數是這樣的:

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