【问题标题】:Getting Instance Of Silex\Application获取 Silex\Application 的实例
【发布时间】:2011-12-08 11:46:19
【问题描述】:

我正在使用Silex 创建一个应用程序,并且想知道是否有可能以某种方式在我无法在方法参数中执行method_name(Application $application) 的地方获取Silex\Application 的实例?

例如,假设我在控制器上有一个不是操作的私有方法。如果我把Application $application作为参数,它会抛出一个错误,说我需要传入它。

如果不需要,我宁愿不必手动传递该方法。

【问题讨论】:

    标签: php dependency-injection silex


    【解决方案1】:

    实际上只有两种方法可以做到。

    a) 将Silex\Application 作为参数传递给类的构造函数,并将其分配为实例变量。

    b) 手动将 Silex\Application 作为参数传递给您的私有方法。

    您确定您的班级需要完整的应用程序吗?依赖注入的重点是直接注入依赖,而不是注入容器(没错,Silex\Application extends \Pimple,就是一个依赖注入容器。

    【讨论】:

    • 嗯,不,我只是想获取存储在 $app['twig'] 中的变量,我该怎么做?我想我只是不确定 Pimple 如何知道一个对象应该通过 DI 传递给一个方法,或者它是一个应该正常传递的普通参数。
    • 您不能自动将参数传递给方法调用。但是你可以将你的控制器类定义为一个服务,并将 twig 注入到该类的构造函数中。
    【解决方案2】:

    根据您对另一个答案的评论,您获得 Silex/Application 的目标是获得那里的 Twig 服务。我解决了在我的 Silex 项目的另一个函数中获取当前应用程序的方法是:

    use \Silex\Application;
    use \Symfony\Component\HttpFoundation\Request;
    
    class myController {
      private $a;
    
      // Route defined as:
      // $app->get('/foo', 'myController::showPage');
      public function showPage(Application $a) {
        $this->a = $a;
        return $this->doAwesome();
      }
    
      private function doAwesome() {
        $twig = $this->a['twig'];
        return $twig->render('awesomePage.twig');
      }
    }
    

    作为路由端点的每个函数都会将传递给它的应用程序保存为类属性,以供其他函数访问。这意味着您必须记住在每个使用 doAwesome() 的函数中使用 $this->a = $a;调用 doAwesome()),但这是我想出的最干净的方法来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-03
      • 2016-06-16
      • 2019-01-15
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多