آشنایی با routing به صورت ابتدایی

Basic introduction to Routing

25 بهمن 1399
Laravel 7.0: آشنایی با routing به صورت ابتدایی (قسمت 16)

در قسمت قبل با نحوه کار با Auth::user آشنا شدیم و به جای name از username برای نمایش در navbar استفاده کردیم اما برای اینکه بتوانیم عنوان پروفایل را نیز روی username بگذاریم باید به داده های کاربر دسترسی داشته باشیم. این داده ها همیشه از سمت controller می آیند اما ما نمی دانیم کنترلر این فایل کجا است و این مسئله، بحث امروز ما است.

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

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

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

این فایل تمام مسیرها یا URL های معتبر برنامه شما را دارد. مثلا در قسمت اول گفته ایم Route::get که یعنی از بین درخواست های get به دنبال آدرس / بگرد (یعنی صفحه اصلی به آدرس http://127.0.0.1:8000/). اگر کاربر وارد این آدرس شد چه کار می کنیم؟ آرگومان دوم اجرا می شود که یک تابع anonymous است. این تابع تنها کاری که می کند برگرداندن یک view به نام Welcome است که یعنی اگر کاربر با درخواست get وارد صفحه اصلی (/) شد فایل welcome.blade.php را برایش بارگذاری کن. این یک روش برای routing است اما روش دیگری نیز وجود دارد.

در قسمت بعدی Auth::routes را داریم که همان آدرس هایی است که به صورت خودکار برای عملیات احراز هویت ساخته می شوند و در جلسه قبل کدهایش را برایتان قرار دادم:

https://github.com/laravel/framework/blob/9b10dcb31f1cc81322f9ec193aea0a8ba9e6db88/src/Illuminate/Routing/Router.php#L1120

سپس آدرس home/ را داریم و گفته ایم اگر کاربر با درخواست get وارد این آدرس شد از کنترلری به نام HomeController استفاده کرده و متد index در آن را اجرا کن. این روش دیگر routing است که می توانیم به جای برگرداندن یک view ساده با یک تابع anonymous از یک controller استفاده کنیم. یادتان باشد که در این روش ابتدا نام فایل کنترلر را بدون پسوند می آوریم (HomeController.php نام فایل کنترلر است) و سپس علامت @ را قرار داده و پس از آن نام متد مورد نظر در آن کنترلر را ذکر می کنیم.

در انتهای این route از متد ()name استفاده شده است. در لاراول می توانیم برای route های خود نام تعریف کنیم (هر نام دلخواهی) تا به جای نوشتن آدرس آن ها (مثل home/) از نامشان استفاده کنیم. در جلسه قبل، از متد has:: برای پیدا کردن Route ها بر اساس نامشان استفاده کرده بودیم و در آینده مثال ها و روش های بیشتری را خواهید دید. فعلا این route ما home نام دارد.

سوال: فایل های دیگر در پوشه routes چطور؟ کار آن ها چیست؟

پاسخ: این فایل ها مسئول بررسی انواع دیگر برنامه هستند. به طور مثال api.php مخصوص تعریف یک API و مسیر های آن برای سایت شما است (اگر بخواهید سایتتان API داشته باشد). معمولا در حوزه وب از web.php و برخی اوقات از api.php استفاده می شود و فایل channels و console مباحث پیشرفته تری هستند که فعلا با آن ها کاری نداریم.

بیایید به این فایل کنترلر نگاهی بیندازیم. از پوشه app به پوشه Http و سپس Controllers بروید. در آنجا فایلی به نام HomeController.php را می بینید که محتویات زیر را دارد:

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function index()
    {
        return view('home');
    }
}

توجه داشته باشید که این فایل یک کلاس است که کلاس Controller را Extend می کند. ما در ایجا دو متد داریم که اولی constructor کلاس است و بعدا در موردش صحبت خواهیم کرد. دومین متد همان متد index است که صدا زده بودیم و تنها کاری که می کند برگرداندن یک view به نام home است (یعنی فایل home.blade.php). همانطور که می بینید این کنترلر و آن تابع anonymous تفاوت چندانی با هم ندارند اما از آنجایی که در برنامه های واقعی نیاز به محاسبات زیادی داریم از کنترلر ها استفاده می کنیم تا فایل web.php را شلوغ نکنیم. فایل web.php باید فقط برای routing باشد، یعنی باید لیستی از route های ما باشد.

اگر یادتان باشد این کنترلر به صورت خودکار و هنگام ساخت سیستم احراز هویت (دستور php artisan ui vue --auth در جلسات اول) ساخته شد بنابراین در constructor خود از یک middleware به نام auth استفاده می کند. ما هنوز به بحث middleware ها نرسیده ایم اما به صورت خلاصه برایتان توضیح می دهم که middleware ها بین یک درخواست و نتیجه آن قرار دارند و شرایط خاصی را چک می کنند. اگر این شرایط برقرار بودند درخواست ادامه پیدا می کند اما اگر شرط خاصی برقرار نبود جلوی درخواست گرفته می شود. مثلا auth بررسی می کند که آیا کاربر authenticated است (آیا login شده است) یا خیر؟ همانطور که می دانید در زبان PHP متد constructor اولین چیزی از یک کلاس است که اجرا می شود بنابراین در همان ابتدای درخواست، middleware ما (auth) اجرا خواهد شد و اگر کاربر لاگین نشده باشد او را به صفحه login یا ورود redirect می کند. آیا این رفتار همان رفتار مد نظر ما است؟

اگر به اینستاگرام بروید (بدون اینکه وارد حسابتان شوید) باز هم می توانیم پروفایل دیگران را ببینیم! بنابراین اگر می خواهیم اینستاگرام را کپی کنیم باید از شر این دستور خلاصه شویم. برای اینکه بتوانیم بهتر تمرین کنیم من دوست دارم کل این فایل را حذف کرده و یک کنترلر جدید بسازم. به نظر شما این کار چطور انجام می شود؟

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

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