آموزش برنامه نویسی - تاپ دمی
آموزش controller در لاراول

آموزش controller در لاراول

لاراول

30 شهریور، 1400

در این مقاله به صورت کامل با نحوه پیاده سازی و کار با کنترل ها (controller) در لاراول آشنا می شید و نکات مهم کنترل رو با مثال باهم بررسی میکنیم.

در الگوی 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 UserControllerinvokable

و با اجرای این دستور مثل قبل یک کنترل برای ما ساخته میشه با ساختار مشابه زیر

<?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 UserControllerresource

با اجرای این دستور یک کنترل ایجاد میشه که همه متد های گفته شده رو برای ما می سازه و همچنین اگه بخوایم از قابلیت 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 نام جدید قرار دادیم و از الان به بعد با این نام ها به این روت ها دسترسی داریم.

امیدوارم که این مقاله آموزشی برای شما مفید باشد.

توسعه دهنده وب

تقريبا ٩ سال از اولين سايتي كه طراحي كردم ميگذره ، این اشتیاق از آن زمان ادامه پیدا کرد که در نهایت من به عنوان یک توسعه دهنده وب مشغول به كار شدم. طي اين سال ها تجربه اي كه از شركت در پروژه ها و چالش هاي ياگيري برنامه نویسی بدست آوردم ، تصميم گرفتم كه اين تجربه رو با بقيه اشتراك بزارم كه نتیجه ی آن شد تاپ دمی.

مقالات مشابه