【问题标题】:Constructor Injection on Silex ControllerSilex 控制器上的构造函数注入
【发布时间】:2013-12-11 06:26:28
【问题描述】:

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

protected $_app;  

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

遇到错误

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

我该如何解决这个问题?或者我怎样才能实现安全注射?

【问题讨论】:

    标签: php symfony dependency-injection silex


    【解决方案1】:

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

    $app = new \Silex\Application();
    $app['controller.index'] = function () use ($app) {
        return new \Smart\Controllers\IndexController($app);
    };
    
    $app->get('/', "controller.index:indexAction");
    

    【讨论】:

    • 我正在使用 yml 路由提供,那我怎么能像这样注入..?
    • @Nisam 只有最后一行是您的路由配置。其他行是服务配置,你应该在 PHP 中进行。
    【解决方案2】:

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

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

    受保护的函数 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" 不存在。', $class)); } 返回数组(新 $class($this->app),$method); } $app['resolver'] = $app->share(function () use ($app) { //测试 if(isset($app['logger'])){ $logger = $app['logger']; }别的{ $记录器=空; } $defaultResolver = new ControllerResolver($logger); return new DecoratorControllerResolverSymfony($defaultResolver, $app, $logger); });

    然后使用构造函数参数 $app 去创建的 AbsractController

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

    对不起我的英语。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这行不通,请查看@wouter-j 对推荐方式的回答
      猜你喜欢
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多