绑定类型提示接口到实现
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 在函数中进行类型提示时不将其识别为实现?
我正在构建 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 在函数中进行类型提示时不将其识别为实现?