绑定类型提示接口实现

时间:2016-09-21 15:41:55

标签: php laravel data-binding ioc-container lumen

我正在构建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中声明为describe

在我的服务提供者寄存器方法中,我创建了一个像这样的绑定

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

但它仍然会抛出同样的错误,有人可以提出这里出了什么问题吗?这是我第一次以这种方式构建应用程序,如果我错过了简单的疏忽,请原谅我

1 个答案:

答案 0 :(得分: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在函数中隐藏类型时不会将其识别为实现?