完美遗忘/响应者

Laravel项目的响应者实现

此包的官方仓库似乎已消失,因此该包已被冻结。

0.3.0 2019-10-17 20:30 UTC

This package is auto-updated.

Last update: 2022-05-18 01:57:36 UTC


README

Laravel项目的响应者实现。

Latest Stable Version Build Status Quality Score Total Downloads

Perfect Oblivion

免责声明

PerfectOblivion命名空间下的包旨在提供一些我更喜欢不在每个项目中从头开始复制的基功能。这里没有什么突破性的东西。

响应者是一种使你的控制器变得精简并保持与响应相关的代码在一个地方的好方法。这个一般想法基于Paul M. Jones的ADR - Action Domain Responder中的“R”。

例如,在你的控制器中

namespace App\Http\Controllers;

use App\MyDatasource;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Responders\Post\IndexResponder;

class PostIndex implements Controller
{
    /**
     * The Responder.
     *
     * @var \App\Http\Responders\Post\IndexResponder
     */
    private $responder;

    /**
     * Construct a new PostIndex Controller.
     *
     * @param \App\Http\Responders\Post\IndexResponder $responder
     */
    public function __construct(Responder $responder)
    {
        $this->responder = $responder;
    }

    public function index(Request $request)
    {
        $data = MyDatasource::getSomeData($request);

        return $this->responder->withPayload($data);
    }
}

然后在你的响应者中

namespace App\Http\Responders\Post;

use PerfectOblivion\Responder\Responder;

class IndexResponder extends Responder
{
    /**
     * Send a response.
     *
     * @return mixed
     */
    public function respond()
    {
        if (request()->isApi()) { // isApi() is not part of this package
            // return json
        }

        return $this->view('posts.index', ['posts' => $this->payload]);
    }
}

与传统的“在控制器动作中处理响应”相比,其优势在于它带来的清晰度,类职责的狭隘性,控制器中的依赖更少,以及整体组织。当与单动作控制器一起使用时,你可以真正清理你的控制器,并为你的代码库带来很多清晰度。

安装

您可以通过Composer安装此包

composer require perfect-oblivion/responders

Laravel版本 > 5.6.0 将自动识别并注册服务提供者。

如果您正在使用较旧版本的Laravel,请将包服务提供者添加到您的 config/app.php 文件中的 'providers' 数组

'providers' => [
    //...
    PerfectOblivion\Services\ResponderServiceProvider::class,
    //...
];

然后,运行

php artisan vendor:publish

并选择 PerfectOblivion/Responders 选项。

这将复制包配置(responders.php)到您的 'config' 文件夹。在这里,您可以设置响应者类的根命名空间

return [

    /*
    |--------------------------------------------------------------------------
    | Namespace
    |--------------------------------------------------------------------------
    |
    | Set the namespace for the Responders.
    |
 */

    'namespace' => 'Http\\Responders'
];

用法

要开始使用PerfectOblivion/Responders,请简单地按照上面的说明操作,然后根据需要生成您的响应者类。例如,要为帖子生成IndexResponder,请在上面的示例中,在您的终端中输入以下命令

php artisan adr:responder Post\\IndexResponder

然后将响应者添加到您的控制器中的依赖项。只需在您的动作中返回响应者。如果您要向响应者传递数据,请调用 withPayload() 方法并传递数据

public function index(Request $request)
{
    $data = MyDatasource::getSomeData();

    // return $this->responder;
    return $this->responder->withPayload($data);
}

注意:响应者实现了Laravel的Responsable接口。如果从您的控制器/动作返回响应者对象,则响应者的 respond() 方法将自动被调用。如果您处于从 respond() 方法返回实现Responsable接口的对象的情况,您需要从您的控制器或动作中显式调用 respond() 方法。例如,使用inertiajs/inertia-laravel包,Inertia::render 方法给您一个Responsable对象。如果您从响应者返回 Inertia::render,您需要从您的控制器或动作中显式调用响应者的 respond() 方法。请参阅下面的示例代码。

// MyController.php
public function index(Request $request)
{
    $data = MyDatasource::getSomeData();

    // return $this->responder->respond();
    return $this->responder->withPayload($data)->respond();
}
namespace App\Http\Responders\Post;

use Inertia\Inertia;
use PerfectOblivion\Responder\Responder;

class IndexResponder extends Responder
{
    /**
     * Send a response.
     *
     * @return mixed
     */
    public function respond()
    {
        return Inertia::render('Posts/Index', ['posts' => $this->payload]);
    }
}

测试

composer test

更新日志

请参阅更新日志,获取有关最近更改的更多信息。

贡献

请参阅贡献指南以获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件发送到clay@phpstage.com,而不是使用问题跟踪器。

路线图

我们计划很快开始处理灵活性和配置工作,并发布一个框架无关的包版本。

致谢

许可

MIT 许可证 (MIT)。请参阅许可文件以获取更多信息。