فهرست:

مقدمه آشنایی با Middleware در لاراول

Middleware به عنوان یک رابط بین request و response عمل می کند و در واقع نوعی مکانیسم بررسی است. در این مبحث Middleware را بطور اختصاری برای شما شرح می دهیم. به عنوان مثال فرض کنید باید کاربری را احراز هویت کنیم، با کمک Middleware می توانیم بررسی کنیم کاربری که وارد ساید شده است به صفحه اصلی هدایت و در غیر این صورت به صفحه ورود هدایت شود. Middleware را می توان با اجرای دستور زیر ایجاد کرد.

[pastacode lang=”php” manual=”php%20artisan%20make%3Amiddleware%20%3Cmiddleware-name%3E” message=”” highlight=”” provider=”manual”/]

در خط فرمان بالا می توانید را با نام Middleware خود جایگزین کنید. Middleware ایجاد شده را می توانید در فهرست app/Http/Middleware مشاهده کنید. برای درک بهتر مثال زیر را بررسی می کنیم. مرحله اول: AgeMiddleware را ایجاد با دستور زیر ایجاد می کنیم.

[pastacode lang=”markup” manual=”php%20artisan%20make%3Amiddleware%20AgeMiddleware%0A” message=”” highlight=”” provider=”manual”/]

مرحله دوم: AgeMiddleware در app/ Http/Middleware ایجاد خواهد شد. فایل جدید ایجاد شده دارای کد زیر است.

[pastacode lang=”php” manual=”%3C%3Fphp%0A%0Anamespace%20App%5CHttp%5CMiddleware%3B%0Ause%20Closure%3B%0A%0Aclass%20AgeMiddleware%20%7B%0A%20%20%20public%20function%20handle(%24request%2C%20Closure%20%24next)%20%7B%0A%20%20%20%20%20%20return%20%24next(%24request)%3B%0A%20%20%20%7D%0A%7D” message=”app/Http/Middleware” highlight=”” provider=”manual”/]

رجیستر کردن Middleware در لاراول

ما به دو صورت می توانیم Middleware در لاراول تعریف نماییم:

  • Global Middleware
  • Route Middleware

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

[pastacode lang=”php” manual=”protected%20%24middleware%20%3D%20%5B%0A%20%20%20%5CIlluminate%5CFoundation%5CHttp%5CMiddleware%5CCheckForMaintenanceMode%3A%3Aclass%2C%0A%20%20%20%5CApp%5CHttp%5CMiddleware%5CEncryptCookies%3A%3Aclass%2C%0A%20%20%20%5CIlluminate%5CCookie%5CMiddleware%5CAddQueuedCookiesToResponse%3A%3Aclass%2C%0A%20%20%20%5CIlluminate%5CSession%5CMiddleware%5CStartSession%3A%3Aclass%2C%0A%20%20%20%5CIlluminate%5CView%5CMiddleware%5CShareErrorsFromSession%3A%3Aclass%2C%0A%20%20%20%5CApp%5CHttp%5CMiddleware%5CVerifyCsrfToken%3A%3Aclass%2C%0A%5D%3B” message=”app/Http/Kernel.php” highlight=”” provider=”manual”/]

برای بکار بردن Route Middleware از متغیر $routeMiddleware بصورت زیر استفاده می کنیم.

[pastacode lang=”php” manual=”protected%20%24routeMiddleware%20%3D%20%5B%0A%20%20%20’auth’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CAuthenticate%3A%3Aclass%2C%0A%20%20%20’auth.basic’%20%3D%3E%20%5CIlluminate%5CAuth%5CMiddleware%5CAuthenticateWithBasicAuth%3A%3Aclass%2C%0A%20%20%20’guest’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CRedirectIfAuthenticated%3A%3Aclass%2C%0A%5D%3B” message=”app/Http/Kernel.php” highlight=”” provider=”manual”/]

در مثال قبل AgeMiddleware را ایجاد کرده ایم. اکنون می توانیم آن را در دو ویژگی Global Middleware و Route Middleware بصورت زیر در فایل app/Http/Kernel.php تعریف کنیم.

[pastacode lang=”php” manual=”%3C%3Fphp%0A%0Anamespace%20App%5CHttp%3B%0Ause%20Illuminate%5CFoundation%5CHttp%5CKernel%20as%20HttpKernel%3B%0A%0Aclass%20Kernel%20extends%20HttpKernel%20%7B%0A%20%20%20protected%20%24middleware%20%3D%20%5B%0A%20%20%20%20%20%20%5CIlluminate%5CFoundation%5CHttp%5CMiddleware%5CCheckForMaintenanceMode%3A%3Aclass%2C%0A%20%20%20%20%20%20%5CApp%5CHttp%5CMiddleware%5CEncryptCookies%3A%3Aclass%2C%0A%20%20%20%20%20%20%5CIlluminate%5CCookie%5CMiddleware%5CAddQueuedCookiesToResponse%3A%3Aclass%2C%0A%20%20%20%20%20%20%5CIlluminate%5CSession%5CMiddleware%5CStartSession%3A%3Aclass%2C%0A%20%20%20%20%20%20%5CIlluminate%5CView%5CMiddleware%5CShareErrorsFromSession%3A%3Aclass%2C%0A%20%20%20%20%20%20%5CApp%5CHttp%5CMiddleware%5CVerifyCsrfToken%3A%3Aclass%2C%0A%20%20%20%5D%3B%0A%20%20%0A%20%20%20protected%20%24routeMiddleware%20%3D%20%5B%0A%20%20%20%20%20%20’auth’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CAuthenticate%3A%3Aclass%2C%0A%20%20%20%20%20%20’auth.basic’%20%3D%3E%20%5CIlluminate%5CAuth%5CMiddleware%5CAuthenticateWithBasicAuth%3A%3Aclass%2C%0A%20%20%20%20%20%20’guest’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CRedirectIfAuthenticated%3A%3Aclass%2C%0A%20%20%20%20%20%20’Age’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CAgeMiddleware%3A%3Aclass%2C%0A%20%20%20%5D%3B%0A%7D” message=”app/Http/Kernel.php” highlight=”” provider=”manual”/]

پارامتر ها در Middleware

ما همچنین می توانیم پارامترها را با Middleware پاس دهیم به عنوان مثال ، اگر برنامه شما دارای رول های مختلفی مانند user ، admin ، super admin و غیره باشد، می توانید اعتبار سنجی خود را بر مبنای سطوح دسترسی مختلف با پاس دادن پارامتر در Middleware انجام دهید. برای این منظور Middleware مورد نظر را با همانند function زیر با آرگومان سفارشی خود و پس از آرگومان $next ایجاد می کنیم.

[pastacode lang=”php” manual=”public%20function%20handle(%24request%2C%20Closure%20%24next)%20%7B%0A%20%20%20return%20%24next(%24request)%3B%0A%7D” message=”” highlight=”” provider=”manual”/]

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

[pastacode lang=”php” manual=”php%20artisan%20make%3Amiddleware%20RoleMiddleware%0A” message=”” highlight=”” provider=”manual”/]

کد زیر را به فایل ایجاد شده برای RoleMiddlewareat در مسیر Http/Middleware/RoleMiddleware.php اضافه کنید.

[pastacode lang=”php” manual=”%3C%3Fphp%0A%0Anamespace%20App%5CHttp%5CMiddleware%3B%0Ause%20Closure%3B%0A%0Aclass%20RoleMiddleware%20%7B%0A%20%20%20public%20function%20handle(%24request%2C%20Closure%20%24next%2C%20%24role)%20%7B%0A%20%20%20%20%20%20echo%20%22Role%3A%20%22.%24role%3B%0A%20%20%20%20%20%20return%20%24next(%24request)%3B%0A%20%20%20%7D%0A%7D” message=”” highlight=”” provider=”manual”/]

RoleMiddleware را در فایل app/Http/Kernel.php همانند خط هایلایت شده در خط هفتم مثال زیر رجیستر کنید.

[pastacode lang=”php” manual=”class%20Kernel%20extends%20HttpKernel%20%7B%0A%20%20%20protected%20%24routeMiddleware%20%3D%20%5B%0A%20%20%20%20%20%20’auth’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CAuthenticate%3A%3Aclass%2C%0A%20%20%20%20%20%20’auth.basic’%20%3D%3E%20%5CIlluminate%5CAuth%5CMiddleware%5CAuthenticateWithBasicAuth%3A%3Aclass%2C%0A%20%20%20%20%20%20’guest’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CRedirectIfAuthenticated%3A%3Aclass%2C%0A%20%20%20%20%20%20’Age’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CAgeMiddleware%3A%3Aclass%2C%0A%09%20%20’Role’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CRoleMiddleware%3A%3Aclass%2C%0A%20%20%20%5D%3B%0A%7D” message=”app/Http/Kernel.php” highlight=”7″ provider=”manual”/]

حال با خط فرمان زیر TestController را ایجاد نمایید.

[pastacode lang=”markup” manual=”php%20artisan%20make%3Acontroller%20TestController%20–plain” message=”” highlight=”” provider=”manual”/]

حال به فایل app/Http/TestController.php مراجعه و کد زیر را در آن قرار دهید.

[pastacode lang=”php” manual=”%3C%3Fphp%0A%0Anamespace%20App%5CHttp%5CControllers%3B%0A%0Ause%20Illuminate%5CHttp%5CRequest%3B%0Ause%20App%5CHttp%5CRequests%3B%0Ause%20App%5CHttp%5CControllers%5CController%3B%0A%0Aclass%20TestController%20extends%20Controller%20%7B%0A%20%20%20public%20function%20index()%20%7B%0A%20%20%20%20%20%20echo%20%22%3Cbr%3ETest%20Controller.%22%3B%0A%20%20%20%7D%0A%7D” message=”app/Http/TestController.php” highlight=”” provider=”manual”/]

به فایل app/Http/routes.php مراجعه و کد زیر را در آن قرار دهید. با اضافه کردن یک دونقطه (:) بعد از اسم میدل‌ور، می‌تونیم پارامتر پاس بدیم.

[pastacode lang=”php” manual=”Route%3A%3Aget(‘role’%2C%5B%0A%20%20%20’middleware’%20%3D%3E%20’Role%3Aeditor’%2C%0A%20%20%20’uses’%20%3D%3E%20’TestController%40index’%2C%0A%5D)%3B” message=”app/Http/routes.php” highlight=”” provider=”manual”/]

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

[pastacode lang=”markup” manual=”http%3A%2F%2Flocalhost%3A8000%2Frole” message=”” highlight=”” provider=”manual”/]

خروجی مرورگر شما بصورت زیر خواهد بود.

[pastacode lang=”markup” manual=”Role%3Aeditor%0ATest%20Controller.” message=”” highlight=”” provider=”manual”/]

Terminable Middleware

چنانچه قصد داشته باشید بعد از ارسال response به مرورگر یک فرایند مشخص انجام شود از Terminable Middleware استفاده می کنیم. Terminable Middleware ها بصورت global middleware رجیستر خواهند شد و دو آرگومان $request و $response را دریافت می کنند.

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

[pastacode lang=”php” manual=”php%20artisan%20make%3Amiddleware%20TerminateMiddleware” message=”” highlight=”” provider=”manual”/]

کد زیر را به فایل ایجاد شده برای TerminateMiddleware در مسیر app/Http/Middleware/TerminateMiddleware.php اضافه کنید.

[pastacode lang=”php” manual=”%3C%3Fphp%0A%0Anamespace%20App%5CHttp%5CMiddleware%3B%0Ause%20Closure%3B%0A%0Aclass%20TerminateMiddleware%20%7B%0A%20%20%20public%20function%20handle(%24request%2C%20Closure%20%24next)%20%7B%0A%20%20%20%20%20%20echo%20%22Executing%20statements%20of%20handle%20method%20of%20TerminateMiddleware.%22%3B%0A%20%20%20%20%20%20return%20%24next(%24request)%3B%0A%20%20%20%7D%0A%20%20%20%0A%20%20%20public%20function%20terminate(%24request%2C%20%24response)%20%7B%0A%20%20%20%20%20%20echo%20%22%3Cbr%3EExecuting%20statements%20of%20terminate%20method%20of%20TerminateMiddleware.%22%3B%0A%20%20%20%7D%0A%7D” message=”app/Http/Middleware/TerminateMiddleware.php” highlight=”” provider=”manual”/]

TerminateMiddleware را در فایل app/Http/Kernel.php همانند خط هایلایت شده در خط هشتم مثال زیر رجیستر کنید.

[pastacode lang=”php” manual=”class%20Kernel%20extends%20HttpKernel%20%7B%0A%20%20%20protected%20%24routeMiddleware%20%3D%20%5B%0A%20%20%20%20%20%20’auth’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CAuthenticate%3A%3Aclass%2C%0A%20%20%20%20%20%20’auth.basic’%20%3D%3E%20%5CIlluminate%5CAuth%5CMiddleware%5CAuthenticateWithBasicAuth%3A%3Aclass%2C%0A%20%20%20%20%20%20’guest’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CRedirectIfAuthenticated%3A%3Aclass%2C%0A%20%20%20%20%20%20’Age’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CAgeMiddleware%3A%3Aclass%2C%0A%09%20%20’Role’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CRoleMiddleware%3A%3Aclass%2C%0A%09%20%20’terminate’%20%3D%3E%20%5CApp%5CHttp%5CMiddleware%5CTerminateMiddleware%3A%3Aclass%2C%0A%20%20%20%5D%3B%0A%7D” message=”app/Http/Kernel.php” highlight=”8″ provider=”manual”/]

حال با خط فرمان زیر ABCController را ایجاد نمایید.

[pastacode lang=”markup” manual=”php%20artisan%20make%3Acontroller%20ABCController%20–plain” message=”” highlight=”” provider=”manual”/]

حال به فایل app/Http/ABCController.php مراجعه و کد زیر را در آن قرار دهید.

[pastacode lang=”php” manual=”%3C%3Fphp%0A%0Anamespace%20App%5CHttp%5CControllers%3B%0A%0Ause%20Illuminate%5CHttp%5CRequest%3B%0Ause%20App%5CHttp%5CRequests%3B%0Ause%20App%5CHttp%5CControllers%5CController%3B%0A%0Aclass%20ABCController%20extends%20Controller%20%7B%0A%20%20%20public%20function%20index()%20%7B%0A%20%20%20%20%20%20echo%20%22%3Cbr%3EABC%20Controller.%22%3B%0A%20%20%20%7D%0A%7D” message=”app/Http/ABCController.php” highlight=”” provider=”manual”/]

به فایل app/Http/routes.php مراجعه و کد زیر را در آن قرار دهید.

[pastacode lang=”php” manual=”Route%3A%3Aget(‘terminate’%2C%5B%0A%20%20%20’middleware’%20%3D%3E%20’terminate’%2C%0A%20%20%20’uses’%20%3D%3E%20’ABCController%40index’%2C%0A%5D)%3B” message=”app/Http/routes.php” highlight=”” provider=”manual”/]

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

[pastacode lang=”markup” manual=”http%3A%2F%2Flocalhost%3A8000%2Fterminate” message=”” highlight=”” provider=”manual”/]

خروجی مرورگر شما بصورت زیر خواهد بود.

[pastacode lang=”markup” manual=”Executing%20statements%20of%20handle%20method%20of%20TerminateMiddleware.%0AABC%20Controller.%0AExecuting%20statements%20of%20terminate%20method%20of%20TerminateMiddleware.” message=”” highlight=”” provider=”manual”/]