تعداد بازدید: 1666

Routing

هر لینک از دو بخش ساختار و پارامتر های درونی تشکیل شده است. هر تابع هم از دو بخش ساختار و پارامتر ساخته شده است. پس هر لینک می تونه به اجرای یک تابع منجر بشه.

چرخه درخواست و پاسخ Request – Response

کاربر از طریق لینک درخواست میده . سیستم از روی لینک درخواست رو تحلیل می کنه و اون رو به یک پردازنده (که میتونه controller باشه یا یک تابع معمولی) میده. پردازنده ما در خودش تجزیه و تحلیل انجام میده (گاها با سایر ماژول ها مثل model تقابل هایی رو انجام میده) و پاسخ رو آماده می کنه. پاسخ رو (گاها در قالب چند پارامتر) به view میفرسته و کاربر view رو میبینه.

محتوای پاسخ با توجه به نوع درخواست و همچنین هدر های Http Request می تونه از جنس text/html باشه یا از جنس application/json . پارامترهای پاسخ در هدر های Http Response مشخص می شود.

پس عملگر های کاربر در اپلیکیشن لاراول میشه همون لینک ها . لینک ها هم از طریق کلیک فراخوانی میشن.

Routing در لاراول

در لاراول بر اساس نوع درخواست دو نوع route داریم . به ازای هر کدام از آن ها نیز یه سری MiddleWare داریم :

  • web : درخواست هایی که از طریق web یا همون کلاینت مرورگر به سرور ارسال می شه. این route میان افزار web را داراست . یعنی هر درخواستی که مشمول این route بشه باید از قوانین web Middleware پیروی کنه که یکی از اون ها دارا بودن token می باشد.
  • api : درخواست هایی که مربوط به api میشه . برای ساخت API برای نرم افزار از این route استفاده می کنیم ، این route میان افزار web را ندارد. هر endpoint که در این route تعریف شود در زمان فراخوانی باید در ابتدای آن api را داشته باشیم.

به ازای هر کدام از موارد بالا فایل های api.php و web.php را در مسیر routes داریم. تنها تفاوت در api و web نحوه athenticate و نگهداری session در آنها میباشد.

RouteServiceProvider

زمانی که ما route را توسط متد های یک کنترلر handle می کنیم namespace کنترلر ها توسط RouteServiceProvider لود شده است.این فایل تنظیمات مربوط به Routing را به ازای درخواست هایی که به api یا web می روند به صورت جداگانه داریم.

namespace App\Providers;

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{
    protected $WebNamespace = 'App\Http\Controllers';
    protected $ApiNamespace = 'App\Http\Controllers\api';

    public function boot()
    {
        parent::boot();
    }

    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
    }

    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->WebNamespace)
             ->group(base_path('routes/web.php'));
    }

    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->ApiNamespace)
             ->group(base_path('routes/api.php'));
    }
}

در کلاس بالا ما namespace را به ازای درخواست هایی که به web یا api می روند تعیین کرده ایم.

  • متد WebNamespace تعیین کننده namespace کنترلر مربوط به routing در web می باشد.
  • متد ApiNamespace تعیین کننده namespace کنترلر مربوط به routing در api می باشد.

نکته : به صورت پیش فرض یک namespace برای web , api در نظر گرفته شده است. ما این دو را از هم جدا کردیم . یعنی در مسیر app/Http/Controllers یک پوشه با نام Api درست کردیم و کنترلر های مربوط به api را در آن اضافه می کنیم. در زمان ساخت کنترلر برای api باید این مسیر را اتخاذ کنیم.

نکته : اگر ما کنترلر را به صورت nested کنترلر ها را ساخته باشیم به طور مثال App\Http\Controllers\Photos\AdminController باشیم باید در route به شکل زیر handle کنیم.

Route::get('foo', 'Photos\AdminController@method');

ما می توانی برای یک endpoint خاص مثل api یک Controller namespace و یک Middleware و Controller های خاص داشته باشیم ، تعیین مسیر namespace کنترلر ها در متد mapApiRoutes در کلاس RouteServiceProvider می باشد. حال به جای api می توان هر مورد دیگری بسته به نیاز باشد.

نحوه عملکرد Routing

ما در لاراول می تونیم لینک ها رو تجزیه و تحلیل کنیم. به زبان ساده می تونیم بگیم به ازای هر uri چه چیزی باید اجرا بشه.

در Route ما باید سه پارامتر رو در نظر بگیریم :

  • فعل Http (نظیر get , post ,put , patch, delete, options)
  • url درخواستی
  • callback یا تابع اجرایی به ازای درخواست url

کلاس Route به ازای هر Http Verb یک عملگر خاص داره. به طور مثال برای get :

Route::get($uri, $callback);

هر route می تونه از یک Middleware خاص پیروی کنه. به طور مثال route زیر از auth.basic استفاده می کنه. یعنی تمامی درخواست های فرستاده شده به آن باید از قوانین auth.basic Middleware پیروی کنند.

Route::get('products','ProductController@index')->middleware('auth');

نکات :

  • callback می تونه یک تابع closure باشه یا یک متد از یک کلاس خاص از controller . این که به چه کنترلی بره باید با تعیین namespace به ازای api Route , web Route در قسمت RouteServiceProvider تعیین کنید.
  • calback پارامتر هایی رو میتونه دریافت کنه که این پارامتر ها یا موجود در uri هستند یا می تونه شئ Request جاری در برنامه باشه. (Illuminate\Http\Request $Request)
  • هر Route که تعیین میشه می تونه یک نام خاص داشته باشه که به وسیله تابع کمکی Route در قسمت view می تونیم به Route دسترسی داشته باشیم (لینک نهایی رو بگیریم).
  • در url می تونیم به وسیله {} می تونیم پارامتر تعیین کنیم و در پارامتر ها رو به callback بدیم. همچنین در تابع کمکی Route می تونیم این پارامتر رو در پارامتر دوم تعیین کنیم که مکان اون در uri جایی است که در قسمت routing تعیین کرده باشیم.
  • به uri که پارامتر اول هست endpoint هم می گوییم اگر singular باشد. با مفهوم endpoint در وردپرس آشنا شدیم.
  • استفاده از Middleware برابر با auth به این معنی است که این درخواست برای کسانی پاسخ معتبر خواهد داشت که توسط سیستم Authenticate شده باشند.

مثال :

استفاده از فعل get و به شرط دریافت uri با مقدار shop و ارسال به controller method بدون پارامتری در لینک و در نهایت نام گذاری (product.list) :

Route::get('shop/', 'productController@archive')->name('product.list');

استفاده از فعل get و به شرط دریافت uri با مقدار about-us و ارسال به controller method همراه با پارامتر اختیاری author در لینک و در نهایت نام گذاری (about.us) :

Route::get("about-us/{author?}","aboutPage@index" )->name('about.us');
  • علامت سوالی که در کنار پارامتر قرار گرفته اون پارامتر رو اختیاری می کنه. درغیر این صورت در صورت داده شدن NULL به عنوان این پارامتر به callback خطا خواهیم داشت.
  • ما محدود به دادن یک پارامتر نیستیم . می تونیم چندین پارامتر رو به ترتیب قرار گیری در uri به callback بدیم.

نکته : اگر ما از شئ request در پارامتر های controller استفاده کرده باشیم و همچنین از طریق route هم بهش پارامتر داده باشیم باید پارامتر های route رو پس از dependencies (در اینجا مثلا request) بیاریم.

Route::put('user/{id}', 'UserController@update');

namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
    /**
     * Update the specified user.
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

استفاده از فعل post و به شرط دریافت uri با مقدار admin و ارسال به controller method بدون پارامتری در لینک و در نهایت نام گذاری (save.product) :

Route::post('admin/','productController@saveProduct')->name('save.product');
  • یکی از نمونه های انجام لینک بالا می تونه زمانی باشه که ما فرمی رو submit می کنیم.
  • درسته که ما در لینک پارامتری رو نداریم ولی پارامتر های ارسال شده در شئ Request جاری در برنامه موجوده. که با متدهای خاصی می شه به اشکال خاصی فراخوانی بشه.

استفاده از فعل get و به شرط دریافت uri با مقدار home و ارسال به تابع بدون پارامتری در لینک و در نهایت نام گذاری (home) :

Route::get('/home', function () {
    return 'welcome';
})->name('home');

نکته : یه سری Route پیش فرض در ابزار های لاراول به وجود داره که بعد از اجرای اون ها روی برنامه به لیست Route های ما اضافه میشن. مثلا login , register در Auth

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

نتیجه گیری : هر درخواست به سمت سرور را به شکل یک جمله بپندارید . به شکلی که فاعل آن authentication می باشد که نهان در پارامتر ها یا session می باشد. فعل آن Http Verb و مفعول آن Resource می باشد(به طور مثال Product).

 

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای Routing

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *