Php 将实现绑定到Laravel中的请求/响应?

Php 将实现绑定到Laravel中的请求/响应?,php,symfony,oop,laravel,code-injection,Php,Symfony,Oop,Laravel,Code Injection,问题 我目前正在构建一个小型库,它允许我将信息传递给工厂类,然后工厂类生成一个“RestfulResponse”实例 我试图将这个库构建成框架无关的,这意味着我可以在Laravel以外的项目中使用它 RestfulResponse涉及处理对客户端的响应。我想使用Laravel/Symfony的响应类,但是,为了使其框架不可知,响应类不能是具体的 我可以使用Laravel的IoC容器来导入该类,但是为了实现该类,响应类需要实现一个接口,而它没有实现 有没有办法,或者通过Laravel的IoC容器,

问题

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

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

RestfulResponse涉及处理对客户端的响应。我想使用Laravel/Symfony的响应类,但是,为了使其框架不可知,响应类不能是具体的

我可以使用Laravel的IoC容器来导入该类,但是为了实现该类,响应类需要实现一个接口,而它没有实现

有没有办法,或者通过Laravel的IoC容器,或者通过其他一些PHP技巧,我可以让它工作?注意:我使用的是构造函数依赖项注入,而不是Facades。


代码示例

这个代码示例可以工作,但不是框架无关的

本质上,我需要找到一种方法使其框架不可知,同时仍然依赖于Laravel的响应类

拉威尔反应班

namespace Illuminate\Http;

class Response
{}
namespace App\Restful;

use Illuminate\Http\Response;

class RestfulResponse
{

    protected $response;

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

}
我的工厂班

namespace App\Restful;

class RestfulResponseFactory
{

    protected $restfulResponse;

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

}
RestfulResponse类

namespace Illuminate\Http;

class Response
{}
namespace App\Restful;

use Illuminate\Http\Response;

class RestfulResponse
{

    protected $response;

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

}
静态依赖注入(Laravel的容器处理此问题)


所以我终于有了一个可行的实现,解决方案是相当直接的。Laravel内置了对PSR-7接口的支持,这些接口定义了表示HTTP消息的标准化方法

这意味着您只需在composer中增加两个包,就可以“打开”PSR-7请求/响应接口:

composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros
这些包允许您使用PSR-7接口生成请求和响应。最棒的是,Laravel已经建立了一个服务提供商,将PSR-7接口的请求与zend实现绑定在一起。如果您感兴趣,服务提供商的类别是
illumb\Routing\RoutingServiceProvider

要实现PSR-7响应接口,只需将
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

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

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

感谢Cerad为我指明了使用PSR-7和Symfony Framework桥接器的正确方向

简而言之,答案是否定的。Symfony人一直拒绝任何创建请求/响应接口的尝试。他们说这是件坏事。然而,有一个PSR7接口是如此缓慢地流行。它可能是最接近不可知论界面的东西。不知道Laravel的情况,但是Symfony框架有一个在Symfony请求/响应对象和psr7实现之间转换的桥梁。我不知道PSR-7或桥接。显然拉威尔确实允许你使用symfony bridge(),所以我将尝试一下,如果它有效,将其作为答案发布,我会接受。希望你不介意,但我已经发布了一个答案,因为我有很多话要说。谢谢你的自动回复。你对中间产品没有问题吗?当中间件返回PSR-7响应时,我遇到了一个问题。当psr-7响应在控制器上时,我没有任何问题。