Middleware یا میان افزار در لاراول

Middleware یا میان افزار در لاراول

میان افزار یا Middleware مانند یک لایه بین کاربر و درخواست است. یعنی وقتی کاربر به سرور درخواست ارسال میکند، آن درخواست ابتدا به میان افزار منتقل میشود. سپس میان افزار، بعد از بررسی صحت درخواست ها، آن ها را تایید و یا رد میکند. اگر درخواست کاربر صحت داشته باشد، به backend ارسال میشود. در صورت رد درخواست کاربر، میان افزار کاربر را به صفحه ورود (Login) هدایت خواهد کرد.

از یک Middleware یا میان افزار فرعی می توان برای انجام کارهای مختلف، به جز احراز هویت استفاده کرد. به عنوان مثال میان افزار CORS مسئول افزودن سرصفحه به تمام پاسخ هاست.

فریمورک لاراول شامل چندین Middleware مثل authentication (احراز هویت) و محافظت CSRF است. این میان افزارها در دایرکتوری app/Http/Middleware قرار دارند.

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

ایجاد یک میان افزار در لاراول

ابتدا وارد محیط ترمینال سیستم خود شوید و مانند تصویر زیر دستور ‘php artisan make:middleware ‘name of the middleware را وارد کنید.

در تصویر بالا، دستور “php artisan make:middleware CheckAge” در یک Middleware به نام CheckAge وارد شده است.

این دستور یک کلاس جدید با نام CheckAge در دایرکتوری app/Http/Middleware ایجاد کرده است.

همانطور که میبینید یک میان افزار به نام “CheckAge” با موفقیت ایجاد شده است.

 

اجرای یک میان افزار در لاراول

میتوان مشخص کرد که یک Middleware، در تمام URL ها یا برخی از URL های خاص اجرا شود.

در این مثال ابتدا یک Middleware برای تمام URL ها اجرا میکنیم.

گام اول: فایل kernel.php را باز کنید. سپس path یا مسیر میان افزار موردنظر را در آرایه middleware اضافه کنید.

  1. <?php
  2. namespace App\Http;
  3. use Illuminate\Foundation\Http\Kernel as HttpKernel;
  4. class Kernel extends HttpKernel
  5. {
  6. /**
  7. * The application’s global HTTP middleware stack.
  8. *
  9. * These middleware are run during every request to your application.
  10. *
  11. * @var array
  12. */
  13. protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
  14. \Illuminate\Foundation\Http \Middleware\ValidatePostSize::class,
  15. \App\Http\Middleware\TrimStrings::class,
  16. \App\Http\Middleware\CheckAge
  17. ::class,
  18. \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
  19. ];
  20. /**
  21. * The application’s route middleware groups.
  22. *
  23. * @var array
  24. */
  25. protected $middlewareGroups = [
  26. ‘web’ => [
  27. \App\Http\Middleware\EncryptCookies::class,
  28. \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  29. \Illuminate\Session\Middleware\StartSession::class,
  30. // \Illuminate\Session\Middleware\AuthenticateSession::class,
  31. \Illuminate\View\Middleware
  32. \ShareErrorsFromSession::class,
  33. \App\Http\Middleware\VerifyCsrfToken::class,
  34. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  35. ],
  36. ‘api’ => [
  37. ‘throttle:60,1’,
  38. ‘bindings’,
  39. ],
  40. ];
  41. /**
  42. * The application’s route middleware.
  43. *
  44. * These middleware may be assigned to groups or used individually.
  45. *
  46. *
  47. @var array
  48. */
  49. protected $routeMiddleware = [
  50. ‘auth’ => \Illuminate\Auth\Middleware\Authenticate::class,
  51. ‘auth.basic’ => \Illuminate\Auth\Middleware
  52. \AuthenticateWithBasicAuth::class,
  53. ‘bindings’ => \Illuminate\Routing\Middleware\SubstituteBindings::class,
  54. ‘can’ => \Illuminate\Auth\Middleware\Authorize::class,
  55. ‘guest’ => \App\Http\Middleware
  56. \RedirectIfAuthenticated::class,
  57. ‘throttle’ => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  58. ];
  59. }

گام دوم: دستور php artisan serve را در پنجره Git Bash وارد کنید.

گام سوم: فایل CheckAge.php که به عنوان یک Middleware ایجاد کرده اید را باز کنید.

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class CheckAge
  5. {
  6. /**
  7. * Handle an incoming request.
  8. *
  9. * @param \Illuminate\Http
  10. \Request $request
  11. * @param \Closure $next
  12. * @return mixed
  13. */
  14. public function handle($request, Closure $next)
  15. {
  16. //return “middleware”;
  17. echo “hello world”;
  18. return $next($request);
  19. }
  20. }

قدم چهارم: در آخر در قسمت URL مرورگر خود، آدرس ‘http://localhost/laravelproject/public/‘ را وارد کنید. خروجی شما مانند تصویر زیر خواهد بود.

اکنون در این مثال یک Middleware برای برخی از مسیرهای خاص اجرا میکنیم.

گام اول: فایل kernel.php را باز کنید.

  1. <?php
  2. namespace App\Http;
  3. use Illuminate\Foundation\Http\Kernel as HttpKernel;
  4. class Kernel extends HttpKernel
  5. {
  6. /**
  7. * The application’s global HTTP middleware stack.
  8. *
  9. * These middleware are run during every request to your application.
  10. *
  11. * @var array
  12. */
  13. protected $middleware = [
  14. \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
  15. \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
  16. \App\Http\Middleware\TrimStrings::class,
  17. \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
  18. ];
  19. /**
  20. * The application’s route middleware groups.
  21. *
  22. * @var array
  23. */
  24. protected $middlewareGroups = [
  25. ‘web’ => [
  26. \App\Http\Middleware\EncryptCookies::class,
  27. \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  28. \Illuminate\Session\Middleware\StartSession::class,
  29. // \Illuminate\Session\Middleware\AuthenticateSession::class,
  30. \Illuminate\View\Middleware \ShareErrorsFromSession::class,
  31. \App\Http\Middleware\VerifyCsrfToken::class,
  32. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  33. ],
  34. ‘api’ => [
  35. ‘throttle:60,1’,
  36. ‘bindings’,
  37. ],
  38. ];
  39. /**
  40. * The application’s route middleware.
  41. *
  42. * These middleware may be assigned to groups or used individually.
  43. *
  44. *
  45. @var array
  46. */
  47. protected $routeMiddleware = [
  48. ‘auth’ => \Illuminate\Auth\Middleware\Authenticate::class,
  49. ‘auth.basic’ => \Illuminate\Auth\Middleware
  50. \AuthenticateWithBasicAuth::class,
  51. ‘bindings’ => \Illuminate\Routing\Middleware\SubstituteBindings::class,
  52. ‘can’ => \Illuminate\Auth\Middleware\Authorize::class,
  53. ‘guest’ => \App\Http\Middleware
  54. \RedirectIfAuthenticated::class,
  55. ‘throttle’ => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  56. ‘age’ => \App\Http\Middleware\CheckAge::class ];
  57. }

در قطعه کد  .i.e بالا یعنی

age’ => \App\Http\Middleware\CheckAge::class’

را در یک Middleware که نام آن age است، اضافه کرده ایم.

گام دوم: فایل CheckAge.php را که به عنوان یک میان افزار ایجاد کردید را باز کنید.

گام سوم: کد middleware زیر را در فایل web.php وارد کنید.

  1. Route::Get(‘/’,function()
  2. {
  3. return view(‘welcome’);
  4. })-> middleware(‘age’);
  5. Route::Get(‘user/profile’,function()
  6. {
  7. return “user profile”;
  8. });

توجه داشته باشید که در کد بالا ما middleware را به آدرس root ‘/’ اضافه کرده ایم نه به آدرس ‘user/profile’ .

زمانی که به root URL دسترسی داریم، خروجی به صورت زیر خواهد بود:

خروجی بالا نشان دهنده این است که کد middleware در حال نمایش “hello world” است.

زمانی که به URL, i.e., /user/profile دسترسی داریم، خروجی به صورت زیر خواهد بود:

خروجی بالا به این معنی است که امکان دسترسی به کد middleware وجود ندارد.

زمانی که پارامتر به یک URL منتقل می شود:

web.php

  1. Route::Get(‘/{age}’,function($age)
  2. {
  3. return view(‘welcome’);
  4. })-> middleware(‘age’);

CheckAge.php

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class CheckAge
  5. {
  6. /**
  7. * Handle an incoming request.
  8. *
  9. * @param
  10. \Illuminate\Http\Request $request
  11. * @param \Closure $next
  12. * @return mixed
  13. */
  14. public function handle($request, Closure $next)
  15. {
  16. //return “middleware”;
  17. echo “this is checkage middleware”;
  18. return $next($request);
  19. }}

خروجی:

بررسی وضعیت در میان افزار

میتوان از Middleware ها برای بررسی وضعیت لاراول نیز استفاده کرد. به کدها و خروجی مثال زیر دقت کنید:

  1. Route::Get(‘/{age}’,function($age)
  2. {
  3. return view(‘welcome’);
  4. })-> middleware(‘age’);

————————————————————————————————————————————

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class CheckAge
  5. {
  6. /**
  7. * Handle an incoming request.
  8. *
  9. * @param
  10. \Illuminate\Http\Request $request
  11. * @param \Closure $next
  12. * @return mixed
  13. */
  14. public function handle($request, Closure $next)
  15. {
  16. //return “middleware”;
  17. if($request->age>10)
  18. {
  19. echo “Age is greater than 10”;
  20. }
  21. else
  22. {
  23. echo”Age is not greater than 10″;
  24. }
  25. return $next($request);
  26. }}

خروجی هر دوی آنها به صورت زیر خواهد بود :

 

بستن