فهرست:
مقدمه آشنایی با 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”/]