با درود. اگر مقالهی فصل گذشته را مطالعه کرده باشید گاها به عبارتهایی مانند: متدهای کنترلرها و ... برخوردید و این جملات ممکن است برای شما نامفهوم به نظر برسد. در این فصل قصد داریم به آموزش دقیق و مهندسیشدهی آموزش کنترلرها در فریمورک قدرتمند لاراول بپردازیم و با قوانین آن آشنا شویم.
کنترلرها به عنوان یکی از اساسیترین و مهمترین بخشهای یک وب سایت و یا اپلیکیشن بهحساب میآیند. همانطور که در جریان هستید در الگو و معماری MVC، حرف سوم (C) معادل عبارت Controller است. کنترلرها به عنوان یک واسط بین کاربر، View و Model عمل میکنند و به عبارتی قلب تپندهی یک اپلیکیشن میباشند. چنانچه با معماری MVC آشنایی ندارید، به شما توصیه میکنیم حتما مقالهی زیر را مطالعه بفرمایید:
کنترلرها به صورت مستقیم با مسیرها (routes) در ارتباط هستند. معمولا از آنها برای ایجاد یک ساختار مشخص مانند CRUD استفاده میشود. در CRUD، یک کنترلر میتواند عملیات ساخت (Create)، خواندن (Read)، بروزرسانی (Update) و حذف کردن (Delete) را انجام دهد. مقالهی زیر به صورت دقیق و با جزئیات به توضیح CRUD پرداخته است. به عزیزان توصیه میکنیم که این مقاله را مطالعه کرده و سپس به ادامهی مبحث کنترلر بپردازند:
لازمه ورود به مبحث کنترلرها آشنایی با ماهیت 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$ استفاده میکنیم.
همواره ساختن نرمافزارهایی مبتنی بر اصول 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) { // } }
بسیار عالی. به شما تبریک میگوییم مباحث کنترلرها به اتمام رسید و شما به راحتی میتوانید تمام کنترلرهای اپلیکیشن تحت وب خود را تنها با استفاده از چند دستور ایجاد کنید. در جلسات آینده به توضیح روشهای دریافت و ارسال اطلاعات اشاره خواهیم کرد. با ما همراه باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.