فهرست:

در چارچوب MVC ، حرف ‘C’ مخفف Controller است. کنترلر به عنوان یک رابط جهت دهنده بین Views و Models عمل می کند. در این بخش، شما با Controllers در لاراول آشنا خواهید شد.

ایجاد Controller در لاراول

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

[pastacode lang=”markup” manual=”php%20artisan%20make%3Acontroller%20%3Ccontroller-name%3E%20–plain%0A” message=”” highlight=”” provider=”manual”/]

< controller-name > را با نام کنترل کننده خود جایگزین کنید. کنترلر ایجاد شده را می توان در app/Http/Controllers مشاهده کرد. در مسیر فوق خواهید دید که برخی از مقدمات مورد نیاز شما در فایل مورد نظر ایجاد شده است و می توانید برنامه نویسی دلخواه خود را به آن اضافه کنید. با دستور زیر می توان کنترلر ایجاد شده را از فایل route.php فراخوانی کرد.

[pastacode lang=”php” manual=”Route%3A%3Aget(‘base%20URI’%2C’controller%40method’)%3B%0A” message=”” highlight=”” provider=”manual”/]

حال بیایید آموزش بالا را در یک مثال کاربردی بررسی نماییم. برای ایجاد UserController دستور زیر را اجرا کنید.

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

شما می توانید کنترل کننده ایجاد شده را در فایل Http/Controller/UserController.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%20UserController%20extends%20Controller%20%7B%0A%20%20%20%2F%2F%0A%7D” message=”” highlight=”” provider=”manual”/]

Controller Middleware

ما آموزش های قبلی میدلور ها را بصورت کامل بررسی کرده ایم، شما می توانید از Middleware با کنترلر نیز استفاده کرنید. Middleware همچنین می تواند به Router کنترلر یا متد سازنده کنترلر شما اختصاص یابد.

اختصاص Middleware به Router

[pastacode lang=”php” manual=”Route%3A%3Aget(‘profile’%2C%20%5B%0A%20%20%20’middleware’%20%3D%3E%20’auth’%2C%0A%20%20%20’uses’%20%3D%3E%20’UserController%40showProfile’%0A%5D)%3B” message=”” highlight=”” provider=”manual”/]

در اینجا ما میدلور auth را به UserController در Route اختصاص می دهیم.

اختصاص دادن Middleware به متد سازنده Controller

[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%20UserController%20extends%20Controller%20%7B%0A%20%20%20public%20function%20__construct()%20%7B%0A%20%20%20%20%20%20%24this-%3Emiddleware(‘auth’)%3B%0A%20%20%20%7D%0A%7D” message=”” highlight=”” provider=”manual”/]

در اینجا ما میدلور auth را با استفاده از روش middleware درمتد سازنده UserController تعریف می کنیم. برای بررسی بهتر موارد مورد اشاره در بالا یک مثال کاربردی را پیش می بریم. کد زیر را در فایل app/Http/routes.php قرار دهید.

[pastacode lang=”php” manual=”%3C%3Fphp%0ARoute%3A%3Aget(‘%2Fusercontroller%2Fpath’%2C%5B%0A%20%20%20’middleware’%20%3D%3E%20’First’%2C%0A%20%20%20’uses’%20%3D%3E%20’UserController%40showPath’%0A%5D)%3B” message=”app/Http/routes.php” highlight=”” provider=”manual”/]

با اجرای خط کد فرمان زیر، یک میدل ور به نام FirstMiddleware ایجاد کنید.

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

کد زیر را به FirstMiddleware ایجاد شده در app/Http/Middleware اضافه کنید.

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

با اجرای دستور زیر یک میدلور به نام SecondMiddleware ایجاد کنید.

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

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

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

با اجرای خط فرمان زیر یک کنترلر به نام UserController ایجاد کنید.

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

کد زیر را در مسیر app/Http/UserController.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%20UserController%20extends%20Controller%20%7B%0A%20%20%20public%20function%20__construct()%20%7B%0A%20%20%20%20%20%20%24this-%3Emiddleware(‘Second’)%3B%0A%20%20%20%7D%0A%20%20%20public%20function%20showPath(Request%20%24request)%20%7B%0A%20%20%20%20%20%20%24uri%20%3D%20%24request-%3Epath()%3B%0A%20%20%20%20%20%20echo%20’%3Cbr%3EURI%3A%20′.%24uri%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%24url%20%3D%20%24request-%3Eurl()%3B%0A%20%20%20%20%20%20echo%20’%3Cbr%3E’%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20echo%20’URL%3A%20′.%24url%3B%0A%20%20%20%20%20%20%24method%20%3D%20%24request-%3Emethod()%3B%0A%20%20%20%20%20%20echo%20’%3Cbr%3E’%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20echo%20’Method%3A%20′.%24method%3B%0A%20%20%20%7D%0A%7D” message=”app/Http/UserController.php” highlight=”” provider=”manual”/]

اگر هنوز آن را اجرا نکرده اید ، با اجرای دستور زیر وب سرور داخلی php را راه اندازی کنید.

[pastacode lang=”markup” manual=”php%20artisan%20serve” message=”” highlight=”” provider=”manual”/]

به URL زیر مراجعه کنید.

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

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

[pastacode lang=”markup” manual=”First%20Middleware%0ASecond%20Middleware%0AURI%3A%20usercontroller%2Fpath%0AURL%3A%20http%3A%2F%2Flocalhost%3A8000%2Fusercontroller%2Fpath%0AMethod%3A%20GET” message=”” highlight=”” provider=”manual”/]

Restful Resource Controllers

غالباً هنگام ساخت یک برنامه، ما باید عملیات CRUD (ایجاد، خواندن، به روزرسانی، حذف) را انجام دهیم. لاراول این کار را برای ما آسان می کند. فقط یک کنترلر ایجاد کنید، لاراول به طور خودکار تمام روش های عملیات CRUD را آماده می کند. همچنین می توانید یک Route واحد را برای همه متدها در فایل routes.php ایجاد کنید. مورد بالا را در قالب یک مثال بررسی می کنیم با خط فرمان زیر کنترلر MyController را ایجاد می کنیم.

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

سپس کد زیر را در فایل ایجاد شده در مسیر app/Http/Controllers/MyController.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%20MyController%20extends%20Controller%20%7B%0A%20%20%20public%20function%20index()%20%7B%0A%20%20%20%20%20%20echo%20’index’%3B%0A%20%20%20%7D%0A%20%20%20public%20function%20create()%20%7B%0A%20%20%20%20%20%20echo%20’create’%3B%0A%20%20%20%7D%0A%20%20%20public%20function%20store(Request%20%24request)%20%7B%0A%20%20%20%20%20%20echo%20’store’%3B%0A%20%20%20%7D%0A%20%20%20public%20function%20show(%24id)%20%7B%0A%20%20%20%20%20%20echo%20’show’%3B%0A%20%20%20%7D%0A%20%20%20public%20function%20edit(%24id)%20%7B%0A%20%20%20%20%20%20echo%20’edit’%3B%0A%20%20%20%7D%0A%20%20%20public%20function%20update(Request%20%24request%2C%20%24id)%20%7B%0A%20%20%20%20%20%20echo%20’update’%3B%0A%20%20%20%7D%0A%20%20%20public%20function%20destroy(%24id)%20%7B%0A%20%20%20%20%20%20echo%20’destroy’%3B%0A%20%20%20%7D%0A%7D” message=”app/Http/Controllers/MyController.php” highlight=”” provider=”manual”/]

خط کد زیر را در فایل app/Http/lines.php اضافه کنید.

[pastacode lang=”php” manual=”Route%3A%3Aresource(‘my’%2C’MyController’)%3B%0A” message=”app/Http/routes.php” highlight=”” provider=”manual”/]

اکنون ما با تعریف کنترلر MyController در روت به همه متد های آن کنترلر دسترسی خواهیم داشت.

Implicit Controllers

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

[pastacode lang=”php” manual=”Route%3A%3Acontroller(‘base%20URI’%2C’%3Cclass-name-of-the-controller%3E’)%3B” message=”” highlight=”” provider=”manual”/]

< class-name-of-the-controller > را با نام کلاسی که به کنترل کننده خود داده اید جایگزین کنید. نام متد کنترلر باید با فعل HTTP مانند دریافت یا ارسال شروع شود. اگر آن را با get شروع کنید، این متد فقط درخواست GET را اداره می کند و اگر با post شروع شود، درخواست POST را مدیریت می کند و چنانچه با any شروع شد هر نوع درخواست ارجا شده به آنمتد مدیریت خواهد شد، بعد از فعل HTTP که می توانید ، می توانید هر نام قابل قبول در URI را به متد مورد نظر خود اختصاص دهید. برای درک بهتر این حالت را در غالب یک مثال بررسی می کنیم. برای ایجاد کنترلر ImplicitController از دستور زیر استفاده نمایید.

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

حال محتویات فایل app/Http/Controllers/ImplicitController.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%20ImplicitController%20extends%20Controller%20%7B%0A%20%20%20%2F**%0A%20%20%20%20%20%20*%20Responds%20to%20requests%20to%20GET%20%2Ftest%0A%20%20%20*%2F%0A%20%20%20public%20function%20getIndex()%20%7B%0A%20%20%20%20%20%20echo%20’index%20method’%3B%0A%20%20%20%7D%0A%20%20%20%0A%20%20%20%2F**%0A%20%20%20%20%20%20*%20Responds%20to%20requests%20to%20GET%20%2Ftest%2Fshow%2F1%0A%20%20%20*%2F%0A%20%20%20public%20function%20getShow(%24id)%20%7B%0A%20%20%20%20%20%20echo%20’show%20method’%3B%0A%20%20%20%7D%0A%20%20%20%0A%20%20%20%2F**%0A%20%20%20%20%20%20*%20Responds%20to%20requests%20to%20GET%20%2Ftest%2Fadmin-profile%0A%20%20%20*%2F%0A%20%20%20public%20function%20getAdminProfile()%20%7B%0A%20%20%20%20%20%20echo%20’admin%20profile%20method’%3B%0A%20%20%20%7D%0A%20%20%20%0A%20%20%20%2F**%0A%20%20%20%20%20%20*%20Responds%20to%20requests%20to%20POST%20%2Ftest%2Fprofile%0A%20%20%20*%2F%0A%20%20%20public%20function%20postProfile()%20%7B%0A%20%20%20%20%20%20echo%20’profile%20method’%3B%0A%20%20%20%7D%0A%7D” message=”app/Http/Controllers/ImplicitController.php” highlight=”” provider=”manual”/]

فایل روتر app/Http/routes.php را بصورت زیر تغییر دهید.

[pastacode lang=”markup” manual=”Route%3A%3Acontroller(‘test’%2C’ImplicitController’)%3B” message=”” highlight=”” provider=”manual”/]

Constructor Injection

در این حالت شما به راحتی می توانید، با کمک کانتینر سرویس لاراول یک نمونه از کلاس مورد نظر خود را به متد سازنده کنترلر خود تزریق نمایید. برای درک بهتر این مورد به مثال زیر خوب دقت کنید. کد زیر را در فایل app/Http/routes.php قرار دهید.

[pastacode lang=”php” manual=”class%20MyClass%7B%0A%20%20%20public%20%24foo%20%3D%20’bar’%3B%0A%7D%0ARoute%3A%3Aget(‘%2Fmyclass’%2C’ImplicitController%40index’)%3B” message=”app/Http/routes.php” highlight=”” provider=”manual”/]

و همچنین در قایل app/Http/Controllers/ImplicitController.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%20ImplicitController%20extends%20Controller%20%7B%0A%20%20%20private%20%24myclass%3B%0A%20%20%20%0A%20%20%20public%20function%20__construct(%5CMyClass%20%24myclass)%20%7B%0A%20%20%20%20%20%20%24this-%3Emyclass%20%3D%20%24myclass%3B%0A%20%20%20%7D%0A%20%20%20public%20function%20index()%20%7B%0A%20%20%20%20%20%20dd(%24this-%3Emyclass)%3B%0A%20%20%20%7D%0A%7D” message=”app/Http/Controllers/ImplicitController.php” highlight=”” provider=”manual”/]

حال آدرس زیر را در مرورگر خود اجرا نمایید.

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

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

[pastacode lang=”markup” manual=”MyClass%20%23215%20%7B%20%0A%09%2Bfoo%3Abar%0A%7D” message=”” highlight=”” provider=”manual”/]

Method Injection

در این حالت شما به راحتی می توانید، یک نمونه از کلاس مورد نظر خود را به یک متد کنترلر خود تزریق نمایید. برای درک بهتر این مورد به مثال زیر خوب دقت کنید. کد زیر را در فایل app/Http/routes.php قرار دهید.

[pastacode lang=”php” manual=”class%20MyClass%7B%0A%20%20%20public%20%24foo%20%3D%20’bar’%3B%0A%7D%0ARoute%3A%3Aget(‘%2Fmyclass’%2C’ImplicitController%40index’)%3B” message=”app/Http/routes.php” highlight=”” provider=”manual”/]

و همچنین در قایل app/Http/Controllers/ImplicitController.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%20ImplicitController%20extends%20Controller%20%7B%0A%20%20%20public%20function%20index(%5CMyClass%20%24myclass)%20%7B%0A%20%20%20%20%20%20dd(%24myclass)%3B%0A%20%20%20%7D%0A%7D%20″ message=”app/Http/Controllers/ImplicitController.php” highlight=”” provider=”manual”/]

حال آدرس زیر را در مرورگر خود اجرا نمایید.

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

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

[pastacode lang=”markup” manual=”MyClass%20%23215%20%7B%20%0A%09%2Bfoo%3Abar%0A%7D” message=”” highlight=”” provider=”manual”/]