استفاده از ماکرو requestها و ماکرو responseها در لاراول

گردآوری و تالیف : رضا جمال زاده
تاریخ انتشار : 21 شهریور 1398
دسته بندی ها : لاراول

در این مقاله قصد داریم در مورد درخواست‌ها و پاسخ‌های ماکرو (response and request macros) صحبت کنیم و امکانات گسترده‌ای که در اختیار ما قرار می‌دهند را بررسی کنیم.

قبل از هرچیزی به توضیح مختصر در مورد ماکرو‌ها(macros) می‌پردازیم. ماکرو یکی از ویژگی‌های قدرتمند لاراول است که به ما اجازه می‌دهد که توابع سفارشی‌شده را به اجزاء مختلف لاراول اضافه کنیم. قابلیت ماکرو در لاراول 5.6 ، 5.7 و 5.8 قابل استفاده‌است .

در لیست زیر فسادها و کلاس هایی که قابلیت استفاده از ماکرو را دارند می‌بینیم:

Facades

  • Cache
  • File
  • Lang
  • Request
  • Response
  • Route
  • URL

Illuminate Classes

  • Illuminate\Routing\UrlGenerator
  • Illuminate\Cache\Repository
  • Illuminate\Validation\Rule
  • Illuminate\Console\Scheduling\Event
  • Illuminate\Database\Eloquent\Builder
  • Illuminate\Database\Eloquent\Relation
  • Illuminate\Database\Query\Builder
  • Illuminate\Filesystem\Filesystem
  • Illuminate\Foundation\Testing\TestResponse
  • Illuminate\Http\RedirectResponse
  • Illuminate\Http\Request
  • Illuminate\Http\UploadedFile
  • Illuminate\Routing\ResponseFactory
  • Illuminate\Routing\Router
  • Illuminate\Support\Str
  • Illuminate\Support\Arr
  • Illuminate\Translation\Translator
  • Illuminate\Support\Collection

استفاده از ماکرو requestها

هنگامی که   requests و responses از ویژگی Illuminate\Support\Traits\Macroable استفاده کنند، در این صورت می‌توانیم ماکرو‌ها تعریف کنیم و از آن‌ها در صورت نیاز استفاده کنیم.

تصور کنید شما در اپلیکیشن خود نیاز دارید یک فرآیند را بارها و بارها در نقاط مختلف اپلیکیشن تعریف کنید، در این صورت شما ممکن است تصمیم بگیرید که از روشی استفاده کنید که هرگاه نیاز داشتید در نقاط مختلف برنامه خود آن را تعریف کرده و از آن استفاده کنید.

به طور ساده‌تر، بیایید نگاهی به  Adam Wathan’s idea بیاندازیم. بر اساس این ایده در صورتی‌که پارامتر‌های درخواست ما null نباشد، می‌توان آن درخواست را فیلتر کنیم. شما می‌توانید ماکرو‌های خود را در AppServiceProvider تعریف کنید:

<?php

use Illuminate\Http\Request;

// ...

public function boot()
{
    Request::macro('filter', function () {
        return collect($this->all())->filter();
    });
}

در ادامه می‌توانیم داده‌های درخواست مان را فیلتر کنیم و مجموعه‌ای از المنت‌هایی که non-null هستند را به عنوان نتیجه دریافت کنیم. برای این کار تنها کافی است که متد filter() را پس از درخواست خود قرار دهیم:

// input: ['email' => 'example@user.com', 'name' => null]
$request->filter();
// result: ['email' => 'example@user.com']

همانطور که در بالا دیدید ما می‌توانید بدون نوشتن کد‌های اضافه و تکراری درخواست‌های خود را گسترش و برای آن‌ها توابع کاربردی بنویسیم.

استفاده ار ماکرو responseها

ماکرو ریسپانس‌ها مفهومی مانند ماکرو requestها دارند.اگر ما یک تابع داشته باشیم که بخواهیم از آن بارها و بارها در کنترلر خود استفاده کنیم، در این صورت میکرو ریسپانس‌ها به کار می‌آیند. برای مثال در داده‌هایی خاص با فرمت JSON که داده‌های ثابت آن را به صورت دستی می‌نویسیم و داده‌های پارامتریک را از کنترلر خود می‌گیریم:

return response()->json([
    'status_code' => $statusCode,
    'user_id' => $userId,
    'data' => $data,
]);

همانطور که در بالا می‌بینید نوشتن ریسپانس به این شکل یک مشکل بزرگ در کد‌نویسی نیست، اما وقتی ما می‌توانیم آن را کوتاه‌تر و زیباتر بنویسیم چرا این کار را نکنید برای این کار در AppServiceProvider خود:

<?php

use Illuminate\Http\Response;

public function boot()
{
    Response::macro('toSpecialFormat', function ($code, $id, $data) {
        return Response::json([
            'status_code' => $code,
            'user_id' => $id,
            'data' => $data,
        ]);
    });
}

در ادامه ما به سادگی می‌توانیم از کد کوتاه‌شده‌ی زیر بارها و بارها استفاده کنیم:

return response()->toSpecialFormat($statusCode, $userId, $data);

همانطور که دیدید، در این روش، کدنویسی زیباتر است و خوانایی کدها بهتر است. اگر شما در مورد انواع ماکرو کالکشن‌ها، stringها ، requestها و res ponseها بیشتر جستوجو کنید، ایده‌های جالبی که قابلیت استفاده در اپلیکیشن شما را دارد پیدا می‌کنید.

منبع

مقالات پیشنهادی

  • استفاده از Bootstrap Notification در لاراول 5

    ما معمولا بعد از هر عملی مثل حذف آیتم ها احتیاج به یک notification popup داریم که پیامی شبیه "آیتم مورد نظر حذف شد" داریم, همین کار در زمینه ساخت و آپ...

    امیررضا سیستانه ای