فهرست:

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

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

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

php artisan make:controller <controller-name> --plain

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

Route::get('base URI','controller@method');

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

php artisan make:controller UserController --plain

شما می توانید کنترل کننده ایجاد شده را در فایل Http/Controller/UserController.php مشاهده کنید و می توانید بر اساس نیاز خود آن را تغییر دهید. محتویات فایل ایجاد شده بصورت زیر خواهد بود.

<?php

namespace App\Http\Controllers;

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

class UserController extends Controller {
   //
}

Controller Middleware

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

اختصاص Middleware به Router

Route::get('profile', [
   'middleware' => 'auth',
   'uses' => 'UserController@showProfile'
]);

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

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

<?php

namespace App\Http\Controllers;

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

class UserController extends Controller {
   public function __construct() {
      $this->middleware('auth');
   }
}

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

app/Http/routes.php
<?php
Route::get('/usercontroller/path',[
   'middleware' => 'First',
   'uses' => 'UserController@showPath'
]);

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

php artisan make:middleware FirstMiddleware

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

FirstMiddleware.php
<?php

namespace App\Http\Middleware;
use Closure;

class FirstMiddleware {
   public function handle($request, Closure $next) {
      echo '<br>First Middleware';
      return $next($request);
   }
}

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

php artisan make:middleware SecondMiddleware

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

SecondMiddleware.php
<?php

namespace App\Http\Middleware;
use Closure;

class SecondMiddleware {
   public function handle($request, Closure $next) {
      echo '<br>Second Middleware';
      return $next($request);
   }
}

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

php artisan make:controller UserController --plain

کد زیر را در مسیر app/Http/UserController.php قرار دهید.

app/Http/UserController.php
<?php

namespace App\Http\Controllers;

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

class UserController extends Controller {
   public function __construct() {
      $this->middleware('Second');
   }
   public function showPath(Request $request) {
      $uri = $request->path();
      echo '<br>URI: '.$uri;
      
      $url = $request->url();
      echo '<br>';
      
      echo 'URL: '.$url;
      $method = $request->method();
      echo '<br>';
      
      echo 'Method: '.$method;
   }
}

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

php artisan serve

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

http://localhost:8000/usercontroller/path

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

First Middleware
Second Middleware
URI: usercontroller/path
URL: http://localhost:8000/usercontroller/path
Method: GET

Restful Resource Controllers

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

php artisan make:controller MyController

سپس کد زیر را در فایل ایجاد شده در مسیر app/Http/Controllers/MyController.php بارگذاری می کنیم.

app/Http/Controllers/MyController.php
<?php

namespace App\Http\Controllers;

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

class MyController extends Controller {
   public function index() {
      echo 'index';
   }
   public function create() {
      echo 'create';
   }
   public function store(Request $request) {
      echo 'store';
   }
   public function show($id) {
      echo 'show';
   }
   public function edit($id) {
      echo 'edit';
   }
   public function update(Request $request, $id) {
      echo 'update';
   }
   public function destroy($id) {
      echo 'destroy';
   }
}

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

app/Http/routes.php
Route::resource('my','MyController');

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

Implicit Controllers

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

Route::controller('base URI','<class-name-of-the-controller>');

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

php artisan make:controller ImplicitController --plain

حال محتویات فایل app/Http/Controllers/ImplicitController.php بصورت زیر تغییر دهید.

app/Http/Controllers/ImplicitController.php
<?php

namespace App\Http\Controllers;

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

class ImplicitController extends Controller {
   /**
      * Responds to requests to GET /test
   */
   public function getIndex() {
      echo 'index method';
   }
   
   /**
      * Responds to requests to GET /test/show/1
   */
   public function getShow($id) {
      echo 'show method';
   }
   
   /**
      * Responds to requests to GET /test/admin-profile
   */
   public function getAdminProfile() {
      echo 'admin profile method';
   }
   
   /**
      * Responds to requests to POST /test/profile
   */
   public function postProfile() {
      echo 'profile method';
   }
}

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

Route::controller('test','ImplicitController');

Constructor Injection

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

app/Http/routes.php
class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');

و همچنین در قایل app/Http/Controllers/ImplicitController.php کد های زیر را بارگذاری نمایید.

app/Http/Controllers/ImplicitController.php
<?php

namespace App\Http\Controllers;

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

class ImplicitController extends Controller {
   private $myclass;
   
   public function __construct(\MyClass $myclass) {
      $this->myclass = $myclass;
   }
   public function index() {
      dd($this->myclass);
   }
}

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

http://localhost:8000/myclass

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

MyClass #215 { 
	+foo:bar
}

Method Injection

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

app/Http/routes.php
class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');

و همچنین در قایل app/Http/Controllers/ImplicitController.php کد های زیر را بارگذاری نمایید.

app/Http/Controllers/ImplicitController.php
<?php

namespace App\Http\Controllers;

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

class ImplicitController extends Controller {
   public function index(\MyClass $myclass) {
      dd($myclass);
   }
} 

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

http://localhost:8000/myclass

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

MyClass #215 { 
	+foo:bar
}