در الگوی MVC ، کنترلر یکی از سه بخش این الگو هست که بین دو بخش دیگر یعنی مدل و ویو نقش واسط را دارد و در اپلیکشن های لاراولی در قسمت routing هر آدرس رو به یک کنترل متصل میکنیم.
اگر در مورد routing اطلاعات کافی ندارید میتونید می تونید مقاله آموزش routing را مطالعه کنید.
ساختن کنترلر
برای ساخت کنترل از دستور زیر استفاده می کنیم.
php artisan make:controller UserController
با اجرا کردن این دستور یک کنترل با نام وارد کرده در دستور ساخته میشه که می تونید داخل پوشه Http/Controllers به اون دسترسی داشته باشید.
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class UserController extends Controller
{
/**
* Show the profile for a given user.
*
* @param int $id
* @return \Illuminate\View\View
*/
public function show($id)
{
return view('user.profile', [
'user' => User::findOrFail($id)
]);
}
}
همانطور که در اول مقاله گقتم باید یک روت رو به کنترل متصل کنیم که برای اینکار وارد فایل web.php میشیم و روت خودمون رو می سازیم.
use App\Http\Controllers\UserController;
Route::get('/user/{id}', [UserController::class, 'show']);
در بالا یه روت ساختیم که به صورت get به متد show در کنترل متصل هست و همه اطلاعات در یافتی به این کنترل فرستاده میشه.
و در UserController که قبلا تعریف کردیم کاربر مورد نظر مون رو پیدا میکنیم از طریق ایدی فرستاده شده از روت و اون رو به پروفایلش انتقال میدیم.
کنترل های تک کاره:
کنترل ها به صورت کلاسهایی می باشند که شامل چندین متد هستند ، حالا اگه در کنترلی که داریم بخوایم فقط یک کار انجام بدیم به این کنترلها Single Action Controllers گفته میشه و برای ساخته این کنترل های به صورت زیر عمل میکنیم.
php artisan make:controller UserController –invokable
و با اجرای این دستور مثل قبل یک کنترل برای ما ساخته میشه با ساختار مشابه زیر
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class UserController extends Controller
{
/**
* Provision a new web server.
*
* @return \Illuminate\Http\Response
*/
public function __invoke()
{
// ...
}
}
ودر قسمت روت ها هم به این شکل عمل می کنیم
use App\Http\Controllers\UserController;
Route::post('/server', UserController::class);
همانطور که در بالا می بینید نیازی نیست که متد کنترل رو مشخص کنیم و فقط اسم کنترلی که مربوط به این روت هست رو میاریم.
میدلور ها در کنترل:
Middleware ها رو علاوه بر اینکه میشه داخل روت مشخص کنیم یعنی به شکل زیر:
Route::get('profile', [UserController::class, 'show'])->middleware('auth');
میتونیم میدلور دلخواهمون رو داخل کنترل هم اضافه کنیم:
class UserController extends Controller
{
public function __construct()
{
$this->middleware('auth');
$this->middleware('show')->only('index');
$this->middleware('user')->except('update');
}
}
در بالا میبینید که میتونیم مشخص کنیم که میدلور روی همه متد ها اعمال بشه یا فقط به یک متد اعمال بشه(only) یا روی همه متد ها به جز یک متد خاص اعمال بشه(except) .
کنترلرهای Resource
داخل کنترل ها متناسب با نیازی که داریم ، کارهای مختلفی انجام میشه ولی چند متد اصلی داریم که همیشه مورد استفاده قرار میگیرند 1- نمایش همه اطلاعات (index) 2- نمایش یک مورد خاص (show) 3- ساخت (create) 4- ویرایش (update) 5- حذف (destroy)
که به صورت جداگانه میشه برای هر کدام از این کارها یک روت تعریف کرد که در بالا مشاهده کردیم به چه صورت یک روت رو به یک کنترل وصل میکنیم.
مشکلی که در انجام این کار پیش میاد این هست که اگر تعداد کنترل های ما زیاد باشه و بخوایم برای هرکدام ازاین کنترلها این عملیات ها رو انجام بدیم تعداد روت های زیادی تکرار میشه و کنترل این کدها سخت میشه. برای اینکه به این مشکل برخورد نکنیم باید از کنترل های resource استفاده کنیم .
برای ساخت این نوع کنترل ها به شکل زیر عمل میکنیم.
php artisan make:controller UserController –resource
با اجرای این دستور یک کنترل ایجاد میشه که همه متد های گفته شده رو برای ما می سازه و همچنین اگه بخوایم از قابلیت Route Model Binding استفاده کنیم میتونیم به این شکل زیر اسم مدلمون هم مشخص کنیم:
php artisan make:controller UserController –resource --model=User
با اجرای این دستور متدی در کنترلر که نیاز به مدل ها باشه به شکل زیر ساخته میشه
public function show(Request $request, User $user)
{
}
همچنین برای استفاده از این کنترل ها در روت ها به شکل زیر عمل میکنیم
Route::resource('users', UserController::class);
و این کد به صورت خلاصه همه متد های ساخته شده در کنترل رو شامل میشن و نیاز به نوشتن همه اونها نیست ، و به صورت کلی میشه متد هایی که در Resource Controller ساخته میشه رو در جدول زیر میبینید.
Verb URI Action Route Name
GET /users index users.index
GET /users/create create users.create
POST /users store users.store
GET /users/{user} show users.show
GET /users/{user}/edit edit users.edit
PUT/PATCH /users/{user} update users.update
DELETE /users/{user} destroy users.destroy
کوتاه کردن روت های resource
در بعضی مواقع در فایل web.php تعداد زیادی روت از نوع resource داریم ، برای اینکه بتونیم کوتاه تر از قبل روتها رو بنویسیم میتونیم همه ی روت های resource رو داخل یک روت قرار بدیم
Route::resources([
'users' => 'UserController',
'articles' => 'ArticleController',
'tags' => 'TagController'
]);
در بالا ما سه روت رو داخل یک روت resource قراردادیم .
انتخاب نام دلخواه برای روت resource
وقتی ما یک روت resource میسازیم به صورت پیشفرض نام هایی برای هریک از روت ها قرار میده که در جدول بالا به این روت ها و نام هاشون اشاره کردیم ، حالا فرض کنید که می خواهید یک نام دلخواه برای روت در نظر بگیرید برای این کار به شکل زیر عمل میکنیم:
Route::resource('users', 'UserController')->names([
'index' => 'users.all',
'create' => 'users.build',
]);
در بالا ما برای دو روت index و create نام جدید قرار دادیم و از الان به بعد با این نام ها به این روت ها دسترسی داریم.
امیدوارم که این مقاله آموزشی برای شما مفید باشد.
توسعه دهنده وب
تقريبا ٩ سال از اولين سايتي كه طراحي كردم ميگذره ، این اشتیاق از آن زمان ادامه پیدا کرد که در نهایت من به عنوان یک توسعه دهنده وب مشغول به كار شدم. طي اين سال ها تجربه اي كه از شركت در پروژه ها و چالش هاي ياگيري برنامه نویسی بدست آوردم ، تصميم گرفتم كه اين تجربه رو با بقيه اشتراك بزارم كه نتیجه ی آن شد تاپ دمی.
- آموزش ساخت صفحه ی وب سایت با استفاده از HTML و css
- ساخت فروشگاه اینترنتی با html ، css و bootstrap - بخش اول
- آموزش نصب ، راه اندازی و کامپایل sass
- میانبر های مفید ادیتور VSCode
- سوالات مصاحبه ای از php و لاراول
این مقاله چقدر مفید بود ؟