2015-11-01 193 views
0

我想注入一個依賴到我的Silex控制器,因爲我需要一個在我的控制器中的用戶類型的對象,並處理它的一些東西。Silex控制器依賴注入

$app->mount("/users", new \MyApp\Controller\Provider\User($user)); 

而且我通過實現ControllerProviderInterface實現控制器:

class User implements ControllerProviderInterface{ 
    protected $user; 

    public function __construct($user){ 
     //... 
    } 

    public function connect(Application $app) 
    { 
     //... 
    } 
} 

的途徑和方法都是在控制器設置。沒有依賴注入一切工作正常。但是隻要我編輯的代碼,並添加註射我收到以下錯誤:

Missing argument 1 for ...::__construct()

當我創建的對象,我該參數發送給它,但不知何故的Silex沒有通過一個構造函數之前創建一個實例任何爭論。

回答

4

另一種方法是使用ServiceController而不是ControllerProvider。您可以通過這種方式獲得更熟悉的依賴注入感受。

$app->register(new Silex\Provider\ServiceControllerServiceProvider()); 

$app["user"] = function() { 
    return new User(); 
}; 
$app["user.controller"] = function() use ($app) { 
    return new UserController($app["user"]); 
}; 

$app->get("https://stackoverflow.com/users/{id}", "user.controller:get"); 

...

class User implements UserInterface 
{ 
    // ... 
} 

...

class UserController 
{ 
    protected $user; 

    public function __construct(UserInterface $user) 
    { 
     $this->user = $user; 
    } 

    public function get(Request $request, $id) 
    { 
     $this->user; 

     // Do stuff 
    } 
} 

參考:http://silex.sensiolabs.org/doc/providers/service_controller.html

+0

這看起來更熟悉。我想我會使用ServiceController,因爲我們知道它更像是依賴注入。感謝您的回答和您的幫助! – Tobias

1

Silex採用了一種不同的方法來進行依賴注入,而不是您可能會習慣或可能期望的方式。 Silex\Application是在Silex應用程序的幾乎任何上下文中都可用的依賴注入容器。您可以使用$app註冊您的依賴關係,這些依賴關係可以通過$app注入到您可能需要的任何環境中。以下是您可能在您的情況下做的一些事例。

$app["user"] = function() { 
    return new \MyApp\Service\User(); 
}; 

$app->mount("/users", new \MyApp\Controller\Provider\User()); 

...

class User implements ControllerProviderInterface 
{ 
    public function connect(Application $app) 
    { 
     $controller = $app["controller_factory"]; 

     $controller->get("/{id}", array($this, "get")); 

     return $controller; 
    } 

    public function get(Application $app, Request $request, $id) 
    { 
     $user = $app["user"]; 

     // Do stuff 
    } 
} 

依賴注入Silex的是不同的,它需要時間來適應了一點,但一旦你熟悉它,它是一個很高興一起工作,這是非常有效的。

+0

太謝謝你了! :) – Tobias

0

這個接受的答案不是問題的答案。而答案中所描述的事情也不是依賴注入,或者是它的一種真正的粗糙形式。它更像是硬編碼$應用到你的控制器中。

問題中的代碼應該不加修改地工作。連接函數和構造函數中的代碼可能會幫助您找出問題出在哪裏。它不是呼籲登上,林肯定。

+0

你有什麼建議?我可以通過$ app對象注入依賴項,但是,這不是最好的方法。也許你可以舉一個例子,說明它應該如何正確完成。我的代碼不起作用,我無法弄清楚錯誤在哪裏。謝謝 – Tobias

+0

@bloodstix,我的目標是提供慣用的Silex方式來做到這一點。就像我在回答中所說的,Silex採用不同的方法來注入依賴關係。這並不是大多數人在考慮依賴注入時所想到的,但它具有相同的目的。你可能會爭辯說這不是嚴格的依賴注入,但那真的不是我的觀點。 – Jason

+0

不,它不。它只是沒有爲你呈現一個自動的。 在$ app中註冊您的單個依賴關係,然後爲您的類提供需要依賴關係的類,以及$ Component上的具體索引。 這將是依賴注入。要求具體的東西,而不是容器。 – bloodstix