绑定类型提示接口到实现


Binding type hinted interface to implementation

我正在构建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();
    }
}

由于Guzzle Request已经实现了Psr'Http'Message'RequestInterface,我认为这可以传递进去,但我的应用程序一直抛出一个异常,说传递给store()的属性应该声明为resourcececontrolercontract

在register方法中的服务提供者中,我创建了如下绑定

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

但是它仍然抛出相同的错误,有人能建议哪里出了问题吗?这是我第一次用这种方式构建应用程序,如果我忽略了一个简单的疏忽,请原谅我

所以我们知道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不将其识别为实现?