gpt4 book ai didi

php - 将实现绑定(bind)到 Laravel 中的请求/响应?

转载 作者:搜寻专家 更新时间:2023-10-31 21:04:12 24 4
gpt4 key购买 nike

问题

我目前正在构建一个小型库,它允许我将信息传递给 Factory 类,然后该类生成一个“RestfulResponse”实例。

我正在尝试将这个库构建为与框架无关,这意味着我可以在 Laravel 以外的项目中使用它。

RestfulResponse 负责处理对客户端的响应。我想使用 Laravel/Symfony 的 Response 类,但是,为了使其与框架无关,Response 类不能是具体的。

我可以使用 Laravel 的 IoC 容器来导入该类,但是要使其正常工作,Response 类需要实现一个接口(interface),而它并没有。

有什么办法,无论是通过 Laravel 的 IoC 容器,还是通过其他一些 PHP 技巧,我都能让它工作吗?注意:我使用的是构造函数依赖注入(inject),而不是 Facades。


代码示例

此代码示例有效,但与框架无关。

本质上,我需要找到一种方法使其与框架无关,同时仍然依赖于 Laravel 的 Response 类。

Laravel 的响应类

namespace Illuminate\Http;

class Response
{}

我的工厂类

namespace App\Restful;

class RestfulResponseFactory
{

protected $restfulResponse;

public __constructor(RestfulResponse $restfulResponse)
{
$this->restfulResponse = $restfulResponse;
}

}

RestfulResponse 类

namespace App\Restful;

use Illuminate\Http\Response;

class RestfulResponse
{

protected $response;

public __constructor(Response $response)
{
$this->response = $response;
}

}

静态依赖注入(inject)(Laravel 的容器处理这个)

namespace App\Restful;

use Illuminate\Http\Response;

$factory = new RestfulResponseFactory(
new RestfulResponse(new Response)
);

最佳答案

所以我终于有了一个可行的实现,而且解决方案相当简单。 Laravel 内置了对 PSR-7 接口(interface)的支持,它定义了一种表示 HTTP 消息的标准化方式。

这意味着您可以通过简单地在 composer 中需要两个额外的包来“打开”PSR-7 请求/响应接口(interface):

composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros

这些包允许您使用 PSR-7 接口(interface)来生成请求和响应。最好的部分是 Laravel 已经设置了一个服务提供者来将对 PSR-7 接口(interface)的请求与 zend 实现绑定(bind)。如果您对服务提供者感兴趣,类是 Illuminate\Routing\RoutingServiceProvider

要实现 PSR-7 响应接口(interface),只需包含 Psr\Http\Message\ResponseInterface 作为依赖项,让 Laravel 的容器处理具体实现。

与框架无关的最终结果将如下所示:

namespace App\Restful;

use Psr\Http\Message\ResponseInterface;

class RestfulResponse
{

protected $response;

public __constructor(ResponseInterface $response)
{
$this->response = $response;
}

}

我在尝试实现 PSR-7 响应时遇到的主要问题是 API 与 Laravel 的不同,这需要一点学习曲线。但是,通过评论对其进行了很好的记录,因此您可以使用它们来学习 API。

创建响应要求构造函数的第一个参数是Stream,而不是字符串。您可以使用 fopen 轻松创建流:

$stream = fopen('php://memory, 'wb+');
fwrite($stream, 'Hello, world.');

感谢 Cerad 为我指明了将 PSR-7 与 Symfony 框架的桥梁结合使用的正确方向。

关于php - 将实现绑定(bind)到 Laravel 中的请求/响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35338980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com