ララベル応答マクロ


この記事では、ララヴィルフレームワークを使用している私の大好きな機能の一つについてお話します.はい、応答マクロです.
私はそれが何であるかを共有し、どのように我々の応答をより簡単に再利用できるように、この機能を使用することができます.
それを始めましょう!

レスポンスマクロとは


レスポンスマクロは、ルートまたはコントローラで再利用できるカスタムレスポンスです.
REST APIを構築するときは、一般的にユーザーにデータを返すためにresponse()ヘルパーを使用します.
また、要求されたデータが見つからないことを伝えたい場合は、response()ヘルパーの変形を使用します.
たとえば、これらの類似構文を使用して、残りのAPIを処理します.
// Syntax when sending response with HTTP no content
return response()->json(null, 204);

// Syntax when sending response with HTTP not found
return response()->json(['message' => 'post not found'], 404);

// Syntax when sending response with HTTP created
return response()->json(['message' => 'register success'], 201);
さて、想像してください.これらの応答を簡単な形式に変換することができますが、同じ機能を持っている場合.
// Syntax when sending response with HTTP no content
return response()->noContent();

// Syntax when sending response with HTTP not found
return response()->notFound('post not found');

// Syntax when sending response with HTTP created
return response()->created('register success');
それはクールな権利ですか?これらの構文でさえ、それらのレスポンスの実際の動作がユーザにどのようなものを送っているかをはっきりと伝えます.

どのように応答マクロを追加するには?


基本的に、Responseの中で我々のカスタム反応を登録することによって、Laravel App\Providers\AppServiceProviderオブジェクトの基本的な特徴を拡張するだけです.
オープンファイルapp/Providers/AppServiceProvider.phpIlluminate\Support\Facades\Response(応答ファサード)を使用します.Response::macro()メソッド内でカスタム応答を使用するbootを登録します.Response::macro()は2つのパラメータを持ちます.カスタムレスポンス名と実装.上記のカスタムレスポンスの1つを加えましょう.
<?php

namespace App\Providers;

use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Response::macro('notFound', function ($message) {
            return Response::make(compact('message'), HTTP_NOT_FOUND);
        });
    }
}

どのように応答マクロを使用する?


レスポンスマクロを追加した場合は、ルートまたはコントローラ内で使用できます.たとえば、PostController.phpのメソッドshowを内部に持ちます.
<?php

public function show(int $id)
{
    $post = Post::find($id);

    if (is_null($post)) {
        $message = sprintf('Post with id %d not found', $id);

        return response()->notFound($message);
    }

    return new PostResource($post);
}

ボーナス


レスポンスマクロは、単純なカスタムレスポンスのみを追加しません.レスポンスマクロを使用して、マイクロ機能を追加することができます.
たとえば、レスポンスマクロを追加して、MarkdownをHTMLに変換できます.
<?php

public function boot()
{
    Response::macro('markdown', function ($raw) {
        // fake markdown converter library
        $md = new Markdown();

        return Response::make(['data' => $md->toHTML($raw)], HTTP_OK);
    });
}
あなたのコントローラーの中でそれを使ってください.
<?php

public function render(int $id)
{
    $post = Post::find($id);

    if (is_null($post)) {
        $message = sprintf('Post with id %d not found', $id);

        return response()->notFound($message);
    }

    return response()->markdown($post->body);
}
注意:
レスポンスマクロとして応答マクロを使用する場合は、常にそのような検証、データベース操作などの中にビジネスロジックを入れないことを忘れないでください.