2011-12-08 114 views
2

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

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

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

回答

4

真的只有两种方法可以做到这一点。

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

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

你确定你需要在你的班级完整的应用程序?依赖注入的关键是直接注入依赖关系,而不是注入容器(是的,Silex\Application延伸\Pimple,这是一个依赖注入容器。

+0

嗯,不,我只想找到储存在$ app ['twig']中的变量,我该怎么做?我想我只是不确定Pimple如何知道一个对象应该通过DI传递给一个方法,或者这是一个通常应该传递的正常参数。 – ryanzec

+1

您不能自动将参数传递给方法调用。但是你可以将你的控制器类定义为一个服务,并将细枝注入该类的构造函数中。 – igorw

+0

我试过这个:http://pastebin.com/LpuC0cYn:但它不起作用。 – ryanzec

2

从你对另一个答案的评论,你的目标是获得Silex /的应用是让在枝条服务没有办法,我已经解决了让在我的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'); 
    } 
} 

每一个功能是路由,然后将节省的端点应用程序将其作为类属性传递给其他函数,这意味着您必须记住在每个函数中都要执行$this->a = $a; t使用doAwesome()之前调用doAwesome()),但这是我提出来解决这个问题的最简洁的方法。