فصل ۴:‌ کنترلر‌ها در لاراول

20 اسفند 1395
درسنامه درس 5 از سری لاراول
Laravel-Main-controllers

با درود. اگر مقاله‌ی فصل گذشته را مطالعه کرده باشید گاها به عبارتهایی مانند:‌ متدهای کنترلرها و ... برخوردید و این جملات ممکن است برای شما نامفهوم به نظر برسد. در این فصل قصد داریم به آموزش دقیق و مهندسی‌شده‌ی آموزش کنترلرها در فریم‌ورک قدرتمند لاراول بپردازیم و با قوانین آن آشنا شویم.

مقدمه

کنترلر‌ها به عنوان یکی از اساسی‌ترین و مهم‌ترین بخش‌های یک وب سایت و یا اپلیکیشن به‌حساب می‌آیند. همانطور که در جریان هستید در الگو و معماری MVC، حرف سوم (C) معادل عبارت Controller است. کنترلرها به عنوان یک واسط بین کاربر، View و Model عمل می‌کنند و به عبارتی قلب تپنده‌ی یک اپلیکیشن می‌باشند. چنانچه با معماری MVC آشنایی ندارید، به شما توصیه می‌کنیم حتما مقاله‌ی زیر را مطالعه بفرمایید:

کنترلرها به صورت مستقیم با مسیرها (routes) در ارتباط هستند. معمولا از آنها برای ایجاد یک ساختار مشخص مانند CRUD استفاده می‌شود. در CRUD، یک کنترلر می‌تواند عملیات ساخت (Create)، خواندن (Read)، بروزرسانی (Update) و حذف کردن (Delete) را انجام دهد. مقاله‌ی زیر به صورت دقیق و با جزئیات به توضیح CRUD پرداخته است. به عزیزان توصیه می‌کنیم که این مقاله را مطالعه کرده و سپس به ادامه‌ی مبحث کنترلر بپردازند:

آرتیسَن Artisan

لازمه ورود به مبحث کنترلر‌ها آشنایی با ماهیت Artisan در لاراول است. آرتیسن یا Artisan به عنوان یک رابط خط فرمان یا Interface Command-line امکاناتی را در اختیار برنامه‌نویس و توسعه‌دهنده قرار می‌دهد تا با اجرای فرمان‌های خاص، عملیاتی متناسب با آن را انجام دهد. برای اجرای Artisan باید در صفحه پروژه‌ی خود CMD یا خط فرمان ویندوز و یا SSH را باز کرده و دستور php artisan را وارد کنید. با دستور زیر می‌تواند به صفحه راهنمایی Artisan دسترسی داشته باشید:

php artisan help

ساخت کنترلر لاراول

برای ساخت یک کنترلر لاراول ابتدا باید دستور زیر را دی CMD اجرا کنید:

php artisan make:controller UsersController

توسط فضای‌نام make ساختار و اسلکت‌بندی یک کنترلر ایجاد شده و توسط این دستور فایلی تحت عنوان UsersController.php در مسیر app/Http/Controller ایجاد خواهد شد که محتویات درون این فایل به صورت زیر می‌باشد:

<?php
namespace App\Http\Controllers;

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

class MySampleController extends Controller
{
	// A lot of methods
}

به هر تابعی که درون کنترلرها نوشته می‌شود یک متد (Method) گفته می‌شود. بنابراین برای کنترلر Users یک متد به نام ()home می‌نویسیم:

<?php
namespace App\Http\Controllers;

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

class MySampleController extends Controller
{
	public function home(){
		return "Hello Roxo!";
	}
}

حال درون فایل routes/web.php مسیر زیر را اضافه می‌کنیم:

Route::get('/', 'UsersController@home');

بنابراین در صورتیکه کاربر آدرس /http://www.roxo.ir را وارد کند، کنترلر Users فعال شده و متد ()home‌ فراخوانی می‌شود و سپس در پاسخ به این درخواست کاربر عبارت Hello Roxo! چاپ می‌شود.

دریافت ورودی از کاربر

یکی از مهم‌ترین اکشن‌ها یا فعالیت‌هایی که کنترلرها و متدهای آن انجام می‌دهند دریافت اطلاعات ورودی کاربران و انجام عملیات روی آنهاست. این فرآیندها با متدهای get یا post صورت می‌پذیرد. به عنوان مثال دستورهای زیر را در نظر بگیرید:

// routes/web.php
Route::get('tasks/create', 'TasksController@create');
Route::post('tasks', 'TasksController@store');

با متد get صفحه‌ی http://www.roxo.ir/tasks/create کنترلر Tasks فعال و متد create اجرا خواهد شد (که این متد یک صفحه را به کاربر نمایش می‌دهد). سپس با وارد کردن اطلاعات در صفحه http://www.roxo.ir/tasks/create و فشردن دکمه‌ی ثبت، این اطلاعات با متد post به کنترلر Tasks ارسال شده و متد store جهت ذخیره سازی این اطلاعات فعال می‌شود.

برای دقت عمل بیشتر دستورهای زیر را ملاحظه بفرمایید که در متد store ذخیره شده‌اند:

// TasksController.php
...
	public function store()
	{
		$task = new Task;
		$task->title = Input::get('title');
		$task->description = Input::get('description');
		$task->save();
		return redirect('tasks');
	}

در این مثال مشاهده می‌کنید که ابتدا یک شیء جدید از مدل Task ساخته شده است (مبحث مدل‌‎ها در فصل‌های آینده شرح داده خواهد شد) سپس مقادیر فیلدهای title و description در دیتابیس برابر مقادیر دریافتی از فرم می‌باشد. در اینجا از Input:: Facade استفاده شده است. این Facade اطلاعات مقادیر موجود در فیلدهای ارسالی را در متغییر task->title$ ذخیره می‌کند.

Input::get(fieldName)

این دستور اطلاعات ورودی هر فیلد را دریافت می‌کند (در حالت POST) و به یک متغییر انتساب می‌دهد.

تزریق وابستگی‌ها در کنترلرها

Facade لاراول یک رابط (Interface) بسیار ساده را برای تزریق وابستگی‌ها به کنترلرها ایجاد کرده است که استفاده از آن بسیار مفید می‌باشد. درباره‌ی تزریق وابستگی‌های لاراول و به اصطلاح Service Container ها در فصول بعدی به طور کامل صحبت خواهیم کرد. تزریق وابستگی‌های لاراول را می‌توانید به عنوان یک جادو تصور کنید! روش دیگری برای ذخیره کردن اطلاعات کاربران در کنترلر وجود دارد. این روش استفاده از کلاس Request در مسیر Illuminate\Http\Request می‌باشد. به مثال زیر توجه کنید:

// TasksController.php
...
	public function store(\Illuminate\Http\Request $request)
	{
		$task = new Task;
		$task->title = $request->input('title');
		$task->description = $request->input('description');
		$task->save();
		return redirect('tasks');
	}

همانطور که ملاحظه می‌کنید با استفاده از روش تزریق وابستگی، از کلاس Request یک نمونه‌ی request$ درنظر گرفتیم و آن را به عنوان ورودی به آرگومان متد store ارسال کردیم. حال به جای استفاده از Input:: Facade، از شیء request$ استفاده می‌کنیم.

منابع کنترلرها (Resource Controllers)

همواره ساختن نرم‌افزارهایی مبتنی بر اصول CRUD با کدنویسی زیادی همراه است و گاها توسعه‌دهنده دچار سردرگمی می‌شود. برای رفع این سردرگمی‌ها فریم‌ورک لاراول امکاناتی را در اختیار شما قرار داده است تا با نوشتن تنها و تنها یک مسیر (route) و یک دستور artisan کنترلر موردنظر به همراه متدهای CRUD ساخته شود. با لاراول جادو کنید! دستور آرتیسن این نوع کنترلرها به صورت زیر می‌باشد:

php artisan make:controller UsersController --resource

پس از اجرای دستور فوق فایل UsersResourceController.php در مسیر app\Http\Controller ایجاد شده که محتویات آن شامل متدهای مختلف است.

سپس باید به مسیرها در فایل routes\web.php دستور زیر را اضافه کنید:

Route::resource('users', 'َUsersResourceController');

حال برای روشن تر شدن موضوع دستور زیر را در CMD تایپ کنید:

php artisan route:list

این دستور اطلاعاتی مشابه ذیل به شما ارائه می‌دهد و شامل تمام مسیرهایی‌ست که برای ساخت CRUD مورد استفاده قرار می‌گیرد:

+--------+-----------+-------------------+---------------+----------------------------------------------+--------------+
| Domain | Method    | URI               | Name          | Action                                       | Middleware   |
+--------+-----------+-------------------+---------------+----------------------------------------------+--------------+
|        | GET|HEAD  | /                 |               | Closure                                      | web          |
|        | GET|HEAD  | api/user          |               | Closure                                      | api,auth:api |
|        | GET|HEAD  | users             | users.index   | App\Http\Controllers\UsersController@index   | web          |
|        | POST      | users             | users.store   | App\Http\Controllers\UsersController@store   | web          |
|        | GET|HEAD  | users/create      | users.create  | App\Http\Controllers\UsersController@create  | web          |
|        | GET|HEAD  | users/{user}      | users.show    | App\Http\Controllers\UsersController@show    | web          |
|        | PUT|PATCH | users/{user}      | users.update  | App\Http\Controllers\UsersController@update  | web          |
|        | DELETE    | users/{user}      | users.destroy | App\Http\Controllers\UsersController@destroy | web          |
|        | GET|HEAD  | users/{user}/edit | users.edit    | App\Http\Controllers\UsersController@edit    | web          |
+--------+-----------+-------------------+---------------+----------------------------------------------+--------------+

همانطور که ملاحظه می‌کنید به جای نوشتن چندین مسیر تنها با یک دستور توانستید تمام مسیرهای موردنیاز را برای یک کنترلر ایجاد کنید. همچنین محتویات فایل UsersController.php به صورت ذیل خواهد بود:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UsersController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

بسیار عالی. به شما تبریک می‌گوییم مباحث کنترلرها به اتمام رسید و شما به راحتی می‌توانید تمام کنترلرهای اپلیکیشن تحت وب خود را تنها با استفاده از چند دستور ایجاد کنید. در جلسات آینده به توضیح روش‌های دریافت و ارسال اطلاعات اشاره خواهیم کرد. با ما همراه باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری لاراول توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (7 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهرداد
19 آذر 1397
Route::resource('users', 'َUsersResourceController'); سلام در خط بالا دو تا اشتباه هست اولا قبل از UsersResourceController یک کاراکترآپسترفی هست که با کپی در محیط کد دیده میشه دوم این کلاس مطابق با سایر توضیحات باید UsersController باشه

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

sajjad
02 تیر 1397
بعد اجرای دستورات در cmd برای ساخت کنترلر این خطا در cmd ظاهر میشه مشکل از کجاست؟؟؟ php' به عنوان یک فرمان داخلی یا خارجی شناخته نمی شود برنامه قابل اجرا یا فایل دسته ای

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
03 تیر 1397
سلام وقت شما بخیر به احتمال خیلی زیاد روی پوشه ی مورد نظر نیستید. و باید با دستور cd ابتدا به پوشه مورد نظر بروید و سپس دستورهای artisan را اجرا کنید. یا در غیر این صورت php‌ روی سیستم شما نصب نیست و دستورات شناخته نمیشوند.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

sajjad
02 تیر 1397
سلام من میخوام یک کنترولر بسازم...تمام دستورات هم درست انجام میدم ولی کنترلر رو نمیسازه باید چکار کرد php artisan php artisan make:controller ProductController

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
03 تیر 1397
سلام وقت شما بخیر به احتمال خیلی زیاد روی پوشه ی مورد نظر نیستید. و باید با دستور cd ابتدا به پوشه مورد نظر بروید و سپس دستورهای artisan را اجرا کنید. یا در غیر این صورت php‌ روی سیستم شما نصب نیست و دستورات شناخته نمیشوند.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

فاطمه
24 فروردین 1397
خیلی خوب بود ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

محبوبه ملک لو
22 فروردین 1397
سلام خسته نباشید. موضوع کاملا ابتدایی بود و باید مطالب مربوط به کنترلر که در سایت خود لاراول اموزش داده ، در اینجا بیان میشد بازم ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امین
14 مهر 1396
چطور میشه دستورات آرتیسان رو در وندوز اجرا کرد؟اینو لطفا بیشتر توضیح بدین برای من خطا میده

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
15 مهر 1396
با سلام متن خطا را ارسال کنید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مرتضی
09 خرداد 1396
تا اینجاش که کلی لذت بردم و حیفم اومد نظر ندم وتشکر نکنم .... واقعا ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مسعود
07 آبان 1397
مرسی از مطالب خوبتون .

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.