2013-10-14 79 views
2

我在我的app.php文件做這樣一個共享服務:

$app['rules'] = $app->share(function() use($app) { 
    return new MyProject\Rules($app); 
}); 

然後:

namespace MyProject; 

use Silex\Application; 

class Rules 
{ 

    private $app; 
    public $request; 

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


    public test() { 
     print_r($this->app['something']); 
    } 
} 

但是,當我訪問$app['rules']->test();在$應用它是一種新版本的$ app,並且它沒有我在應用程序的其他部分稍後在$app中設置的變量。有什麼方法可以訪問父版$app而不是內部版本?

回答

6

您注射完整$appRules構造使用類型提示__construct(Application $app)而是獲得由DIC的通話時間注射$app,你逝去的TI當前狀態的變量$app(在use部分)。

您必須使用其中一種,您所做的方式將覆蓋類型提示並在當前狀態下傳遞該變量,而不會注入未來的屬性。

順便說一句,你是注射整個容器(Silex \ Application)。更好的方法是隻注入所需的服務。

$app['rules'] = $app->share(function($app) { //$app is Injected automatically when called 
    return new MyProject\Rules($app); //here you pass the whole container 
    return new MyProject\Rules($app['something']); //here you pass only the required dependency 
}); 

中的代碼MyProject是好的,假的構造,因爲它是。

+0

如果我不在'Rules()'中傳遞任何東西,它似乎沒有任何方法可以訪問Rules類中的$ app。你建議'返回新的MyProject \ Rules($ app);'和'public function __construct($ app)'? (我需要在我的共享函數中使用整個$ app)。 – David

+1

我會用代碼示例更新我的答案以做你想做的事,但我強烈建議你多閱讀一下[Pimple](https:// github.com/fabpot/Pimple)(Silex的依賴注入容器組件)用於更好地理解Silex的工作原理。 – xmarcos

+0

我更新了代碼,如果仔細觀察,我沒有使用'use'來傳遞'$ app',它將在Silex的通話時注入。 – xmarcos