2016-09-21 130 views
2

我構建了Lumen應用程序,並試圖用一種非常實用的風格構建它,並帶有小的可重用和可交換包。綁定類型暗示接口實現

所以我有這樣

use Psr\Http\Message\ServerRequestInterface; 

interface ResourceControllerContract 
{ 
    public function store(ServerRequestInterface $request); 
} 

一個抽象的資源控制器的接口。在我的用戶資源控制器實現

use GuzzleHttp\Psr7\ServerRequest; 

final class UserController extends ResourceController 
{  
    public function store(ServerRequest $request) 
    { 
     $request = $request->getParsedBody(); 
    } 
} 

因爲狂飲請求已經實現了PSR \ HTTP \信息\ RequestInterface,我推測這可以通過,但我的應用程序不斷拋出一個異常,說屬性傳遞給store()應該聲明爲描述在ResourceControllerContract

在register方法我的服務提供商,我創建像這樣

$this->app->bind(
     'Psr\Http\Message\ServerRequestInterface', 
     'GuzzleHttp\Psr7\ServerRequest' 
    ); 

一個具有約束力,但它仍然拋出了同樣的錯誤,能有人建議是怎麼回事錯在這裏?這是我第一次以這種方式構建應用程序所以請原諒我,如果我錯過了一個簡單的監督

回答

0

所以計算出來的UserController的實施應該是像這樣

use Psr\Http\Message\ServerRequestInterface; 

final class UserController extends ResourceController 
{  
    public function store(ServerRequest $request) 
    { 
     $request = $request->getParsedBody(); 
    } 
} 

然後見好就收的綁定來綁定GuzzleHttp \ Psr7 \ ServerRequest到Psr \ Http \ Message \ ServerRequestInterface

有人可以解釋爲什麼即使GuzzleHttp \ Psr7 \ ServerRequest已經實現Psr \ Http \ Message \ ServerRequestInterface它必須綁定到laravel服務提供者。或者只是簡單的PHP無法識別它作爲一個實現時,類型暗示在一個函數?

+0

因爲Laravel不知道它是否存在,換句話說,依賴注入容器不知道如何注入該類。 – GiamPy