کار با کنترلرها
در لاراول، کنترلرها (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 'لیست کاربران';
}
}
مثال :
- تعریف یک کنترلر که دارای دو اکشن 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 | /posts | index | posts.index |
| GET | /posts/create | create | posts.create |
| POST | /posts | store | posts.store |
| GET | /posts/{post} | show | posts.show |
| GET | /posts/{post}/edit | edit | posts.edit |
| PUT | /posts/{post} | update | posts.update |
| DELETE | /posts/{post} | destroy | posts.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)
{
// ذخیرهسازی کاربر جدید
}
}