در لاراول، کنترلرها (Controllers) کلاس‌هایی هستند که مسئول پردازش درخواست‌های ورودی و بازگرداندن پاسخ مناسب به کاربر می‌باشند. استفاده از کنترلرها به شما این امکان را می‌دهد که منطق برنامه را از فایل‌های مسیریابی (routes) جدا کرده و ساختار کد را سازمان‌دهی کنید.
یکی از سه عنصر اصلی الگوی طراحی MVC کنترلرها هستند. در فایلrouting.php میتوانیم درخواستها را به یک کنترلر و اکشن خاصی ارسال کنیم به طور مثالآ ادرس

http://www.example.com/user/5


در مثال زیر یک مسیر به کنترلر UserController و اکشن showProfile هدایت میکند.


Route::get('user/{id}', [UserController::class, 'showProfile']);

🛠️ ایجاد کنترلر در لاراول

برای ایجاد یک کنترلر جدید، می‌توانید از دستور Artisan زیر استفاده کنید:

php artisan make:controller UserController

این دستور یک فایل کنترلر با نام UserController.php در مسیر app/Http/Controllers ایجاد می‌کند. در داخل این فایل، می‌توانید متدهایی برای پردازش درخواست‌های مختلف تعریف کنید:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
public function index()
{
return 'لیست کاربران';
}
}


مثال :

  1. تعریف یک کنترلر که دارای دو اکشن sum , sub است که دو ورودی دریافت کرده و نتیجه تفریق یا جمع انها را بازمیگرداند

namespace App\Http\Controllers;

class calcController extends Controller

{

function sum(float $num1,float $num2){

return $num1+$num2;

}

function sub(float $num1,float $num2){

return $num1-$num2;

}

}

2.ایجاد یک روتر :

در روتر زیر دو پارامتر num1,num2 از طریق متد get دریافت میشود و سپس اکشن sum از کنترلر calcController فراخوانی میشود

Route::get('/sum/{num1}/{num2}', [calcController::class, 'sum'])

در روتر زیر دو پارامتر num1,num2 از طریق متد get دریافت میشود و سپس اکشن sub از کنترلر calcController فراخوانی میشود

Route::get('/sub/{num1}/{num2}', [calcController::class, 'sub'])

3.فیلتر کردن ورودی ها:

ممکن از موارد دریافتی از url عدد نباشند بنابراین باید از عدد بودن انها اطمینان حاصل کنیم

Route::get('/sum/{num1}/{num2}', [calcController::class, 'sum'])->whereNumber(['num1','num2']);

Route::get('/sub/{num1}/{num2}', [calcController::class, 'sub'])->whereNumber('num1')->whereNumber('num2');


🔄 استفاده از کنترلر در فایل مسیرها (routes)

برای ارتباط مسیرها با کنترلرها، می‌توانید از متد Route::resource استفاده کنید:

ساخت کنترلر کاربر با 7 متد پیش فرض

php artisan make:controller UserController --recource

use App\Http\Controllers\UserController;

Route::resource('users', UserController::class);

این دستور به‌صورت خودکار مسیرهای زیر را برای عملیات‌های مختلف ایجاد می‌کند:

متدURIمتد کنترلرنام مسیر
GET/postsindexposts.index
GET/posts/createcreateposts.create
POST/postsstoreposts.store
GET/posts/{post}showposts.show
GET/posts/{post}/editeditposts.edit
PUT/posts/{post}updateposts.update
DELETE/posts/{post}destroyposts.destroy

محدود کردن متدها

Route::resource('users', UserController::class)->only([
'index', 'show', 'store'
]);

حذف متدهای خاص

Route::resource('users', UserController::class)->except([
'create', 'edit', 'destroy'
]);

تغییر نام پارامتر

Route::resource('users', UserController::class)->parameters([
'users' => 'member'
]);
// حالا URIها به شکل /users/{member} خواهند بود

تغییر نام مسیرها

Route::resource('users', UserController::class)->names([
'index' => 'users.list',
'show' => 'users.view'
]);

برای مشاهده مسیرهای ایجاد شده می‌توانید از دستور استفاده کنید:

php artisan route:list

استفاده با Route::apiResource

برای APIها می‌توانید از apiResource استفاده کنید که مسیرهای create و edit را ایجاد نمی‌کند زیرا در Api نیازی به ایجاد و نمایش فرم نداریم و کار از طریق json انجام میشود(فرم در کلاینت وجود دارد)

php artisan make:controller UserController --api

Route::apiResource('users', UserController::class);

🧩 کنترلرهای تک‌عملیاتی (Single Action Controllers)

اگر کنترلری فقط یک متد دارد، می‌توانید از کنترلرهای تک‌عملیاتی استفاده کنید:

php artisan make:controller ShowUser --invokable

این دستور یک کنترلر با متد __invoke ایجاد می‌کند که می‌توانید از آن در مسیرها استفاده کنید:

use App\Http\Controllers\ShowUser;

Route::get('user/{id}', ShowUser::class);

🧩 تزریق وابستگی‌ها (Dependency Injection) در کنترلرها

لاراول از Service Container برای تزریق وابستگی‌ها به کنترلرها استفاده می‌کند. می‌توانید وابستگی‌ها را در سازنده کنترلر یا متدهای آن تعریف کنید:

تزریق وابستگی در سازنده:

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
public function __construct(UserRepository $userRepo)
{
$this->userRepo = $userRepo;
}

public function index()
{
$users = $this->userRepo->getAllUsers();
return view('users.index', compact('users'));
}
}

تزریق وابستگی در متد:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
public function store(Request $request)
{
// ذخیره‌سازی کاربر جدید
}
}