绑定类型提示接口到实现

Binding type hinted interface to implementation

我正在构建 Lumen 应用程序,并尝试以非常 SOLID 的精神构建它,使用小型可重用和可交换的包。

所以我有一个抽象资源控制器的接口,比如

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() 的属性应该按照 ResourceControllerContract[=13= 中的描述进行声明]

在我的服务提供商的注册方法中,我创建了一个绑定,如下所示

    $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 在函数中进行类型提示时不将其识别为实现?