我正在构建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'
);
但它仍然会抛出同样的错误,有人可以提出这里出了什么问题吗?这是我第一次以这种方式构建应用程序,如果我错过了简单的疏忽,请原谅我
答案 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在函数中隐藏类型时不会将其识别为实现?