2011-12-08 71 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()),但這是我提出來解決這個問題的最簡潔的方法。