آشنایی با قرارداد مهم RESTful Resource Controller

Familiarity with the Important RESTful Resource Controller Contract

25 بهمن 1399
Laravel 7.0: آشنایی با قرارداد مهم RESTful Resource Controller (قسمت 17)

در قسمت قبل به صورت ابتدایی با routing آشنا شدیم اما به مشکلی برخوردیم. در حال حاضر کنترلر ما که به صورت خودکار توسط لاراول و در هنگام پیاده سازی سیستم authentication ایجاد شده است، کاربر را مجبور می کند که در سیستم login باشد تا بتواند پروفایل کسی را تماشا کند اما اینستاگرام اینطور نیست. در اینستاگرام حتی بدون لاگین بودن هم قابلیت مشاهده پروفایل افراد را داریم (منظورم نسخه وب اینستاگرام است نه اپلیکیشن تلفن همراه آن). به همین دلیل تصمیم گرفتیم که کنترلر پیش فرض را حذف کرده و یک کنترلر جدید بسازیم اما سوال اینجاست که چطور باید این کار را انجام بدهیم؟

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

php artisan

از بین دستورات موجود به دستورات دسته make توجه کنید. این دستورات مخصوص ساخت انواع و اقسام فایل ها هستند. از بین آن ها دستور make:controller را می بینیم که مشخصا کنترلر خواهد ساخت اما چطور؟ برای آشنایی با دستورات در php artisan می توانید از ساختار زیر استفاده کنید:

php artisan help X

به طوری که X دستور شما باشد. با این کار توضیحات این دستور برایتان نمایش داده می شود. مثلا من می گویم:

php artisan help make:controller

نتیجه متنی طولانی است که من با این قسمت آن کار دارم:

Usage:
  make:controller [options] [--] <name>

Arguments:
  name                   The name of the class

یعنی پس از make:controller می توانیم option های مختلفی را به آن پاس بدهیم که در همان متن نمایش داده شده موجود است. در نهایت <name> را داریم که یک آرگومان است و برابر با نام کلاس کنترلر می باشد. اگر آرگومان ها درون <> قرار بگیرند یعنی اجباری هستند و حتما باید این آرگومان را پاس بدهید. با این حساب کار ساخت کنترلر بسیار آسان است اما نام کنترلر خود را چه چیزی بگذاریم؟ در حال حاضر نام کنترلر ما HomeController است اما آیا ما واقعا در حال نمایش Home یا صفحه اصلی سایت هستیم؟ یادتان باشد که ما می خواهیم اینستاگرام را کپی کنیم بنابراین چیزی که نمایش می دهیم پروفایل فرد است نه Home. بنابراین بهتر است نام آن را ProfilesController می گذاریم:

php artisan make:controller ProfilesController

با این کار کنترلر جدید ما به نام ProfilesController.php در مسیر app->Http->Controllers ساخته شده و کاملا خالی است:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfilesController extends Controller
{
    //
}

تنها کاری که باید بکنیم کپی کردن متد index است:

class ProfilesController extends Controller
{
    public function index()
    {
        return view('home');
    }
}

از آنجایی که کنترلر خود را عوض کرده ایم باید به فایل web.php در پوشه routes رفته و این تغییر را به آن اعلام کنیم. در حال حاضر در این فایل از HomeController@index استفاده می کنیم که اشتباه است و باید به شکل زیر تغییر کند:

Route::get('/home', 'ProfilesController@index')->name('home');

برای اطمینان به مرورگر برگشته و صفحه http://127.0.0.1:8000/home را refresh کنید تا مطمئن شویم خطایی رخ نداده است.

مسئله بعدی ما تزریق داده ها به درون این صفحه است تا بتوانیم به جای roxo_ir که یک رشته عادی است از username کاربر استفاده کنیم. روش های مختلفی برای این کار وجود دارد اما مسئله بسیار مهمی وجود دارد که قبل از هر کاری باید با آن آشنا شوید. در لاراول و به طور کل RESTful Actions قرارداد هایی (قرارداد یعنی اجباری نیست اما شدیدا توصیه می شود) برای نام گذاری متد ها و کنترلر ها و غیره داریم. کلمه index در لغت به معنی «فهرست» است بنابراین زمانی که از index استفاده می کنیم، در حال نمایش لیست یا فهرستی از resource ها هستیم. resource هر چیزی در فضای وب است که کاربر می تواند به آن دسترسی داشته باشد.

مثلا تمام محصولات یک فروشگاه در قسمت «لوازم جانبی لپ تاپ» لیست می شود و در اینجا از index صحبت می کنیم اما هنگام نمایش یک محصول خاص (زمانی که کاربر روی یک محصول کلیک می کند تا جزئیات آن را ببیند) دیگر بحث index نیست. در برنامه ما و در صفحه http://127.0.0.1:8000/home ما در حال نمایش تمام resource ها نیستیم بلکه فقط یک پروفایل را نمایش می دهیم. در این باره باید به documentation لاراول به آدرس زیر مراجعه کنیم:

https://laravel.com/docs/7.x/controllers#resource-controllers

لاراول از قراردادی استفاده می کند که مخصوص RESTful resource controller ها است:

قرارداد نام گذاری و مدیریت route ها بر اساس RESTful resource controller
قرارداد نام گذاری و مدیریت route ها بر اساس RESTful resource controller

این قرارداد لیستی از HTTP Verb های از قبل تعیین شده است و هر کدام از این Verb ها به یک URL خاص منتسب می شود. این رابطه در تصویر بالا واضح است و به شدت پیشنهاد می کنم که همیشه در پروژه هایتان از این قرارداد استفاه کنید چرا که جدا از نظم دهی بی نظیر به برنامه هایتان، سرعت توسعه را بسیار بالاتر بده و شما را از سردرگمی انتخاب نام خلاص می کند. اگر به تصویر بالا نگاه کنید متوجه خواهید شد که action ها یا عملیات های مختلفی را داریم بنابراین بهتر است با مثال برایتان توضیح بدهم. یکی از این action ها show نام دارد چرا که مسئول نمایش یک resource است. در تصویر بالا لاراول از یک تصویر (photo) برای مثال خود استفاده کرده است اما ما در حال کار با یک پروفایل هستیم. مهم نیست resource شما تصویر یا فیلم یا پروفایل یا هر چیز دیگری باشد. برای نمایش یک resource از show استفاده می کنیم. اگر می خواستیم لیستی از 30 یا 40 یا 50 کاربر یا محصول را نمایش بدهیم آنگاه باید از index استفاده می کردیم اما فعلا بحثمان روی یک پروفایل است.

در همین تصویر می بینید که برای Show باید از URL خاصی پیروی کنیم:

/photos/{photo}

این URL نکته جدیدی برایمان دارد و آن هم حضور علامت های Curly braces است (علامت های {}). یادتان باشد که در URL های لاراول هر جا علامت های {} را دیدید، بدانید که آن یک متغیر است بنابراین در URL بالا photo یک مقدار متغیر خواهد بود. یعنی چه؟ به URL زیر نگاه کنید:

/photos/1

/photos/2

/photos/3

یعنی به جای {photo} یک مقدار متغیر قرار می گیرد که من در اینجا عدد انتخاب کرده ام اما شما می توانید حروف را انتخاب کنید، مثلا photos/someUsername. اگر این موضوع را در عمل به شما نشان هم بهتر است. در قسمت بعد همین کار را خواهیم کرد.

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

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