مقالات

میان افزار لاراول چگونه کار می کند

میان افزار لاراول یک لایه برنامه میانی است که بین درخواست کاربر و پاسخ برنامه دخالت می کند.

به این معنی که وقتی کاربر (نمایش لاراول) درخواستی را به سرور (کنترل کننده لاراول) می دهد، درخواست از میان افزار عبور می کند. به این ترتیب میان افزار می تواند بررسی کند که آیا درخواست احراز هویت شده است یا خیر: 

  • اگر درخواست کاربر احراز هویت شود، درخواست به باطن ارسال می شود.
  • اگر درخواست کاربر تایید نشده باشد، میان افزار کاربر را به صفحه ورود هدایت می کند.

لاراول به شما این امکان را می دهد defiتکمیل و استفاده از میان افزار اضافی برای انجام انواع کارها به جز احراز هویت. 

میان افزارهای لاراول، مانند احراز هویت و حفاظت CSRF، در دایرکتوری قرار دارند برنامه/Http/Middleware .

بنابراین می توان گفت که میان افزار یک فیلتر درخواست http است که از طریق آن می توان شرایط را تأیید کرد و اقدامات را انجام داد.

ایجاد میان افزار

برای ایجاد یک میان افزار جدید دستور زیر را اجرا می کنیم:

php artisan make:middleware <name-of-middleware>

ما ایجاد می کنیم middleware و ما آن را صدا می زنیم CheckAge, artisan به ما به صورت زیر پاسخ خواهد داد:

پنجره بالا نشان می دهد که میان افزار با موفقیت با نام " ایجاد شده است. CheckAge ".

برای اینکه ببینید میان افزار CheckAge ایجاد شده است یا خیر، به پروژه در پوشه app/Http/Middleware بروید و فایل جدید ایجاد شده را مشاهده خواهید کرد.

فایل جدید ایجاد شده دارای کد زیر است

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

از میان افزار استفاده کنید

برای استفاده از میان افزار، باید آن را ثبت کنیم.

دو نوع میان افزار در لاراول وجود دارد:

  • Middleware globale
  • Route Middleware

Il میان افزار جهانی در هر درخواست HTTP از برنامه اجرا خواهد شد، در حالی که Route Middleware به یک مسیر خاص اختصاص داده خواهد شد. میان افزار را می توان در ثبت نام کرد app/Http/Kernel.php. این فایل دارای دو ویژگی است میان افزار $ e $routeMiddleware . ویژگی $middleware برای ثبت میان افزار جهانی و مالکیت استفاده می شود $routeMiddleware برای ثبت میان افزار مخصوص مسیر استفاده می شود.

برای ثبت جهانی میان‌افزار، کلاس را در انتهای ویژگی $middleware فهرست کنید.

protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

برای ثبت میان افزار مخصوص مسیر، کلید و مقدار را به ویژگی $routeMiddleware اضافه کنید.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

ما ایجاد کردیم CheckAge در مثال قبلی اکنون می‌توانیم این را در ویژگی مسیر میان‌افزار ثبت کنیم. کد چنین ثبت نامی در زیر نشان داده شده است.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
    ];

پارامترهای میان افزار

ما همچنین می توانیم پارامترها را با Middleware ارسال کنیم. 

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

میان افزاری که ایجاد کردیم حاوی تابع زیر است و می توانیم آرگومان های سفارشی را بعد از آرگومان ارسال کنیم $ بعدی .

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

حالا بیایید سعی کنیم پارامتر role را روی یک میان افزار جدید که قرار است از ابتدا ایجاد کنیم، تنظیم کنیم، سپس با اجرای دستور زیر به ایجاد Role Middleware ادامه دهیم.

روش دسته را به صورت زیر تغییر دهید

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

پارامتر را اضافه کردیم $role، و در داخل متد خط echo برای نوشتن خروجی نام نقش.

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

حال اجازه دهید میان افزار RoleMiddleware را برای یک مسیر خاص ثبت کنیم

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
    ];

حال برای تست میان افزار با پارامتر، باید یک درخواست و یک پاسخ ایجاد کنیم. برای شبیه سازی پاسخ، اجازه دهید کنترلری را ایجاد کنیم که آن را TestController می نامیم

php artisan make:controller TestController --plain

دستوری که به تازگی اجرا شده است یک کنترلر جدید در داخل پوشه ایجاد می کند app/Http/TestController.php، و روش را تغییر دهید index با خط echo "<br>Test Controller.";

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
   public function index() {
      echo "<br>Test Controller.";
   }
}

پس از تنظیم پاسخ، درخواست را با ویرایش فایل ایجاد می کنیم routes.phpبا اضافه کردن route role

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

در این مرحله می‌توانیم با مراجعه به URL مثال را امتحان کنیم http://localhost:8000/role

و در مرورگر ما این دو را خواهیم دید echo

Role editor
Test Controller

میان افزار پایان پذیر

Il terminable Middleware برخی از وظایف را پس از ارسال پاسخ به مرورگر انجام می دهد. این را می توان با ایجاد یک میان افزار با روش به دست آورد در میان افزار خاتمه یابد. Il terminable Middleware باید با middleware جهانی است. روش terminate دو آرگومان دریافت خواهد کرد درخواست $ e $response. 

روش Terminate باید مطابق کد زیر ایجاد شود.

php artisan make:middleware TerminateMiddleware

زمانی که میان افزار ایجاد شد app/Http/Middleware/TerminateMiddleware.php بیایید کد را به صورت زیر تغییر دهیم

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
   public function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }
   
   public function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

در این مورد ما یک روش داریم handle و یک روش terminate با دو پارامتر $request e $response.

حال بیایید Middleware را ثبت کنیم

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
        'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
    ];

حال باید یک کنترلر برای شبیه سازی پاسخ ایجاد کنیم

php artisan make:controller XYZController --plain

اصلاح محتویات کلاس

class XYZController extends Controller {
   public function index() {
      echo "<br>XYZ Controller.";
   }
}

حالا باید فایل را ویرایش کنیم routes/web.php اضافه کردن مسیرهای مورد نیاز برای فعال کردن درخواست

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'XYZController@index',
]);

در این مرحله می‌توانیم با مراجعه به URL مثال را امتحان کنیم http://localhost:8000/terminate

و در مرورگر خطوط زیر را مشاهده خواهیم کرد

Executing statements of handle method of TerminateMiddleware
XYZController
Executing statements of terminate method of TerminateMiddleware

Ercole Palmeri

همچنین ممکن است دوست داشته باشید:

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

مقالات اخیر

مداخله نوآورانه در واقعیت افزوده، با یک بیننده اپل در پلی کلینیک کاتانیا

یک عمل جراحی چشم با استفاده از نمایشگر تجاری Apple Vision Pro در پلی کلینیک کاتانیا انجام شد…

3 می 2024

مزایای رنگ آمیزی صفحات برای کودکان - دنیایی از جادو برای همه سنین

توسعه مهارت های حرکتی ظریف از طریق رنگ آمیزی، کودکان را برای مهارت های پیچیده تری مانند نوشتن آماده می کند. رنگ کردن…

2 می 2024

آینده اینجاست: چگونه صنعت کشتیرانی اقتصاد جهانی را متحول می کند

بخش دریایی یک قدرت واقعی اقتصادی جهانی است که به سمت یک بازار 150 میلیاردی حرکت کرده است.

1 می 2024

ناشران و OpenAI توافق نامه هایی را برای تنظیم جریان اطلاعات پردازش شده توسط هوش مصنوعی امضا می کنند.

دوشنبه گذشته، فایننشال تایمز از قراردادی با OpenAI خبر داد. FT مجوز روزنامه نگاری در سطح جهانی خود را صادر می کند…

آوریل 30 2024

نوآوری را به زبان خود بخوانید

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

ما را دنبال کنید