سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
Route در Laravel چیست؟ آموزش کامل Routing در لاراول

Route در Laravel چیست؟ آموزش کامل Routing در لاراول

ممدیر کل سیستم ۹ مهر ۱۴۰۵ ۱۶ دقیقه مطالعه ۱ بازدید
Route در Laravel چیست؟ آموزش کامل Routing در لاراول

وقتی کاربر وارد یک وب‌سایت می‌شود و آدرسی مانند /products یا /login را در مرورگر باز می‌کند، Laravel باید بداند این درخواست قرار است به کدام بخش از برنامه ارسال شود.

اینجاست که Route در Laravel وارد عمل می‌شود.

Route یا Routing وظیفه دارد مشخص کند وقتی یک درخواست HTTP با یک URL و متد مشخص به برنامه Laravel ارسال شد، چه کدی باید اجرا شود و چه پاسخی به کاربر برگردد.

برای مثال:


Route::get('/products', function () {

    return 'Products';

});

در این مثال به Laravel گفته‌ایم:

> اگر کاربر با متد GET به آدرس /products درخواست ارسال کرد، این کد را اجرا کن.

Routing یکی از پایه‌ای‌ترین مفاهیم Laravel است و تقریباً هر پروژه‌ای که با این فریم‌ورک ساخته می‌شود، به Route نیاز دارد.

در این مقاله از پایه شروع می‌کنیم و با تعریف Route، متدهای HTTP، پارامترها، Named Route، Route Group، Middleware، Resource Route، Route Model Binding و ابزارهای مدیریت Route آشنا می‌شویم.


Route در Laravel چیست؟

Route مسیری است که مشخص می‌کند یک درخواست HTTP باید چگونه در برنامه پردازش شود.

به زبان ساده، Route بین:

URL کاربر

و

کدی که باید اجرا شود

ارتباط برقرار می‌کند.

برای مثال:


Route::get('/about', function () {

    return 'About Us';

});

اگر کاربر وارد این آدرس شود:


https://example.com/about

Laravel Route مربوط به /about را پیدا کرده و کد مربوط به آن را اجرا می‌کند.

بنابراین می‌توانیم Route را یکی از نقاط ورود اصلی درخواست‌ها به برنامه Laravel در نظر بگیریم.


# Routeها در Laravel کجا قرار دارند؟

Routeها معمولاً در فایل‌های مربوط به routing پروژه قرار می‌گیرند.

یکی از مهم‌ترین فایل‌ها:


routes/web.php

است.

این فایل معمولاً برای Routeهایی استفاده می‌شود که مربوط به رابط وب برنامه هستند.

برای مثال:


Route::get('/', function () {

    return view('welcome');

});

همچنین در پروژه‌هایی که API دارند، Routeهای API نیز می‌توانند در فایل یا ساختار مربوط به API تعریف شوند.

نکته مهم این است که محل و ساختار دقیق Routeها می‌تواند بر اساس نسخه Laravel و تنظیمات پروژه متفاوت باشد؛ بنابراین بهتر است همیشه ساختار پروژه‌ای که در حال کار روی آن هستید را نیز بررسی کنید.


# ساده‌ترین Route در Laravel

برای ساخت یک Route ساده می‌توانیم از Route::get() استفاده کنیم:


use Illuminate\Support\Facades\Route;



Route::get('/hello', function () {

    return 'Hello Laravel';

});

حالا اگر کاربر به این آدرس مراجعه کند:


/hello

متن زیر نمایش داده می‌شود:


Hello Laravel

ساختار کلی Route به شکل زیر است:


Route::method('/url', function () {

    // code

});

مثلاً:


Route::get('/products', function () {

    return 'Product List';

});


# متدهای HTTP در Routeهای Laravel

Route فقط برای درخواست‌های GET نیست.

Laravel از متدهای مختلف HTTP پشتیبانی می‌کند.

مهم‌ترین آن‌ها عبارت‌اند از:

متدکاربرد معمول
GETدریافت اطلاعات
POSTایجاد یا ارسال اطلاعات
PUTجایگزینی کامل اطلاعات
PATCHویرایش بخشی از اطلاعات
DELETEحذف اطلاعات

# Route با GET

GET معمولاً برای دریافت اطلاعات استفاده می‌شود.


Route::get('/products', function () {

    return 'Products';

});

مثلاً:


GET /products

می‌تواند لیست محصولات را نمایش دهد.


# Route با POST

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


Route::post('/products', function () {

    return 'Product Created';

});

برای مثال فرم ایجاد محصول می‌تواند اطلاعات را به این Route ارسال کند.


POST /products


# Route با PUT

PUT معمولاً برای به‌روزرسانی کامل یک منبع استفاده می‌شود:


Route::put('/products/{id}', function ($id) {

    return "Product {$id} Updated";

});


# Route با PATCH

PATCH معمولاً برای به‌روزرسانی بخشی از اطلاعات استفاده می‌شود:


Route::patch('/products/{id}', function ($id) {

    return "Product {$id} Updated";

});


# Route با DELETE

برای حذف یک منبع:


Route::delete('/products/{id}', function ($id) {

    return "Product {$id} Deleted";

});


# تفاوت GET، POST، PUT، PATCH و DELETE

به‌صورت ساده می‌توان این متدها را این‌گونه در ذهن نگه داشت:


GET      → دریافت

POST     → ایجاد

PUT      → جایگزینی/ویرایش کامل

PATCH    → ویرایش بخشی

DELETE   → حذف

در پروژه‌های واقعی، انتخاب متد مناسب باعث می‌شود ساختار API و برنامه منظم‌تر و قابل فهم‌تر باشد.


# Route و Controller چه ارتباطی دارند؟

در مثال‌های ساده می‌توانیم منطق را مستقیماً داخل Route بنویسیم:


Route::get('/products', function () {

    return 'Products';

});

اما در پروژه‌های واقعی بهتر است منطق اصلی برنامه را داخل Controller قرار دهیم.

مثلاً:


Route::get('/products', [ProductController::class, 'index']);

در این حالت:


Request

   ↓

Route

   ↓

ProductController

   ↓

Response

Route فقط مشخص می‌کند درخواست باید به کدام Controller و متد ارسال شود.

این روش مخصوصاً در پروژه‌های بزرگ اهمیت زیادی دارد.

در مقاله بعدی کلاستر با Controller در Laravel دقیقاً همین موضوع را بررسی خواهیم کرد.


# تعریف Route با Controller

ابتدا Controller را ایجاد می‌کنیم:


php artisan make:controller ProductController

سپس Route را تعریف می‌کنیم:


use App\Http\Controllers\ProductController;



Route::get('/products', [ProductController::class, 'index']);

حالا می‌توانیم در Controller بنویسیم:


public function index()

{

    return 'Products';

}

در نتیجه وقتی کاربر وارد /products شود، متد index() اجرا خواهد شد.


# Route Parameter چیست؟

گاهی URL باید شامل یک مقدار متغیر باشد.

مثلاً برای نمایش محصول شماره 15:


/products/15

می‌توانیم Route زیر را تعریف کنیم:


Route::get('/products/{id}', function ($id) {

    return "Product ID: {$id}";

});

قسمت:


{id}

یک Route Parameter است.

اگر کاربر وارد:


/products/15

شود، مقدار $id برابر با 15 خواهد بود.


# چند Route Parameter

یک Route می‌تواند چند پارامتر داشته باشد.

مثلاً:


Route::get('/users/{user}/posts/{post}', function ($user, $post) {

    return "User: {$user}, Post: {$post}";

});

در این حالت URL می‌تواند چنین باشد:


/users/10/posts/25

و مقدارها به شکل زیر دریافت می‌شوند:


$user = 10;

$post = 25;


# پارامتر اختیاری در Route

گاهی وجود یک پارامتر اجباری نیست.

برای ساخت پارامتر اختیاری از ? استفاده می‌کنیم:


Route::get('/user/{name?}', function ($name = null) {

    return $name ?? 'Guest';

});

در این حالت هر دو URL قابل استفاده هستند:


/user

و:


/user/Saeed

اگر نام ارسال نشود، مقدار $name برابر null خواهد بود.


# محدود کردن Route Parameter با where

فرض کنید می‌خواهیم id فقط عدد باشد.

می‌توانیم Route را محدود کنیم:


Route::get('/products/{id}', function ($id) {

    return $id;

})->where('id', '[0-9]+');

حالا Route فقط مقادیر عددی را قبول می‌کند.

برای مثال:


/products/15

معتبر است.

اما:


/products/abc

مطابق این محدودیت نخواهد بود.


# Named Route چیست؟

در پروژه‌های بزرگ، استفاده مستقیم از URLها در همه جای برنامه می‌تواند مدیریت لینک‌ها را سخت کند.

Laravel امکان نام‌گذاری Routeها را فراهم می‌کند.

مثلاً:


Route::get('/products', function () {

    return 'Products';

})->name('products.index');

حالا Route ما نام زیر را دارد:


products.index


# ساخت URL با Named Route

به‌جای اینکه URL را مستقیماً بنویسیم:


/products

می‌توانیم از نام Route استفاده کنیم:


route('products.index')

مثلاً:


<a href="{{ route('products.index') }}">

    Products

</a>

مزیت این روش این است که اگر بعداً URL را تغییر دهیم، در بسیاری از قسمت‌های برنامه لازم نیست همه لینک‌ها را به‌صورت دستی تغییر دهیم.


# Named Route با Parameter

فرض کنیم Route زیر را داریم:


Route::get('/products/{id}', function ($id) {

    return $id;

})->name('products.show');

برای ساخت URL می‌توانیم بنویسیم:


route('products.show', ['id' => 15])

که URL متناظر را ایجاد می‌کند.


# Redirect در Route

گاهی لازم است کاربر را از یک URL به URL دیگری منتقل کنیم.

برای این کار می‌توانیم از redirect استفاده کنیم:


Route::redirect('/old-page', '/new-page');

یعنی:


/old-page

به:


/new-page

هدایت می‌شود.


# Route Group چیست؟

وقتی چند Route ویژگی مشترکی دارند، می‌توانیم آن‌ها را داخل یک گروه قرار دهیم.

برای مثال اگر چند Route مربوط به بخش Admin باشند، می‌توانیم برای همه آن‌ها یک Prefix تعریف کنیم.


Route::prefix('admin')->group(function () {



    Route::get('/users', function () {

        return 'Users';

    });



    Route::get('/products', function () {

        return 'Products';

    });



});

حالا URLها خواهند بود:


/admin/users

/admin/products


# Route Group با Middleware

یکی از کاربردهای بسیار مهم Route Group، اعمال Middleware مشترک است.

مثلاً:


Route::middleware(['auth'])->group(function () {



    Route::get('/profile', function () {

        return 'Profile';

    });



    Route::get('/orders', function () {

        return 'Orders';

    });



});

در این حالت Routeهای داخل گروه تحت Middleware موردنظر قرار می‌گیرند.

این روش برای بخش‌هایی مانند:

  • پنل مدیریت
  • حساب کاربری
  • سفارش‌ها
  • تنظیمات
  • صفحات خصوصی

بسیار کاربردی است.


# Route Group با Prefix و Name

می‌توانیم چند ویژگی را هم‌زمان روی یک گروه اعمال کنیم.

برای مثال:


Route::prefix('admin')

    ->name('admin.')

    ->group(function () {



        Route::get('/users', function () {

            return 'Users';

        })->name('users');



        Route::get('/products', function () {

            return 'Products';

        })->name('products');



    });

در این حالت نام Routeها به شکل زیر خواهند بود:


admin.users

admin.products

و URLها:


/admin/users

/admin/products

این ساختار در پروژه‌های بزرگ بسیار مفید است.


# Resource Route در Laravel

یکی از امکانات بسیار کاربردی Laravel، Resource Route است.

فرض کنید برای یک Product عملیات CRUD داریم:


List

Create

Store

Show

Edit

Update

Delete

به‌جای اینکه همه Routeها را دستی تعریف کنیم، می‌توانیم از:


Route::resource('products', ProductController::class);

استفاده کنیم.

Laravel مجموعه‌ای از Routeهای استاندارد مربوط به Resource را برای ما تعریف می‌کند.

ساختار معمول آن‌ها:

عملیاتمتدURL
indexGET/products
createGET/products/create
storePOST/products
showGET/products/{product}
editGET/products/{product}/edit
updatePUT/PATCH/products/{product}
destroyDELETE/products/{product}

این ویژگی برای ساخت CRUD بسیار کاربردی است.


# Route Model Binding چیست؟

یکی از امکانات مهم Laravel، Route Model Binding است.

فرض کنیم Route زیر را داریم:


Route::get('/products/{product}', function (Product $product) {

    return $product;

});

Laravel می‌تواند بر اساس پارامتر Route، مدل مربوطه را پیدا کند و آن را به متد منتقل کند.

در نتیجه به‌جای اینکه خودمان:


$product = Product::findOrFail($id);

را در هر Route بنویسیم، Laravel می‌تواند این فرآیند را مدیریت کند.

در Controller نیز همین مفهوم قابل استفاده است:


public function show(Product $product)

{

    return view('products.show', compact('product'));

}

این قابلیت باعث ساده‌تر و تمیزتر شدن کدهای CRUD می‌شود.


# Fallback Route چیست؟

گاهی می‌خواهیم اگر هیچ Route دیگری با درخواست کاربر مطابقت نداشت، یک پاسخ مشخص نمایش داده شود.

برای این کار می‌توان از Fallback استفاده کرد:


Route::fallback(function () {

    return 'Page Not Found';

});

البته در پروژه‌های واقعی معمولاً بهتر است صفحه خطای مناسب و حرفه‌ای برای وضعیت 404 طراحی شود.


# مشاهده لیست Routeهای Laravel

یکی از کاربردی‌ترین دستورات Artisan برای مدیریت Routeها:


php artisan route:list

است.

این دستور اطلاعات Routeهای ثبت‌شده را نمایش می‌دهد.

برای مثال می‌توانیم اطلاعاتی مانند:


GET       /

GET       products

POST      products

GET       products/{product}

را مشاهده کنیم.

اگر در پروژه‌ای Route کار نمی‌کند، یکی از اولین ابزارهایی که باید بررسی کنیم همین دستور است.


# فیلتر کردن Routeها

در پروژه‌های بزرگ ممکن است تعداد Routeها زیاد باشد.

در چنین شرایطی می‌توانیم از امکانات فیلتر و نمایش محدودشده route:list متناسب با نسخه و تنظیمات Laravel استفاده کنیم.

برای مثال می‌توان Routeهای مربوط به یک بخش خاص را راحت‌تر بررسی کرد.

این کار هنگام Debug کردن پروژه بسیار مفید است.


# Route Cache چیست؟

Laravel امکان Cache کردن Routeها را برای محیط‌های مناسب فراهم می‌کند.

دستور مربوط به آن:


php artisan route:cache

است.

برای پاک کردن Route Cache:


php artisan route:clear

در محیط توسعه معمولاً نیازی نیست بدون دلیل Routeها را Cache کنیم؛ اما در استقرار Production می‌توان از قابلیت‌های Cache لاراول برای بهبود فرآیند بارگذاری استفاده کرد.


# Routeهای وب و API چه تفاوتی دارند؟

در یک پروژه Laravel ممکن است هم صفحات وب داشته باشیم و هم API.

برای مثال:


Web:

GET /products

ممکن است یک صفحه HTML را نمایش دهد.

در مقابل API می‌تواند چیزی شبیه:


GET /api/products

باشد و داده را در قالب JSON برگرداند.

مثلاً:


{

    "id": 1,

    "name": "Laptop"

}

بنابراین باید بین نیازهای صفحات وب و API تفاوت قائل شویم.

در مقالات بعدی این کلاستر، موضوع ساخت REST API و API Resource را به‌صورت جداگانه بررسی خواهیم کرد.


# یک مثال عملی: Routeهای سیستم فروشگاه

فرض کنیم یک فروشگاه اینترنتی داریم.

می‌توانیم Routeهای مختلفی مانند موارد زیر داشته باشیم:


Route::get('/products', [ProductController::class, 'index'])

    ->name('products.index');



Route::get('/products/{product}', [ProductController::class, 'show'])

    ->name('products.show');



Route::get('/products/create', [ProductController::class, 'create'])

    ->name('products.create');



Route::post('/products', [ProductController::class, 'store'])

    ->name('products.store');



Route::get('/products/{product}/edit', [ProductController::class, 'edit'])

    ->name('products.edit');



Route::put('/products/{product}', [ProductController::class, 'update'])

    ->name('products.update');



Route::delete('/products/{product}', [ProductController::class, 'destroy'])

    ->name('products.destroy');

اما چون این ساختار یک CRUD استاندارد است، می‌توانیم آن را ساده‌تر کنیم:


Route::resource('products', ProductController::class);

این یکی از دلایلی است که شناخت امکانات Routing در Laravel می‌تواند حجم کد پروژه را کاهش دهد.


# ترتیب Routeها چرا مهم است؟

یکی از اشتباهات رایج هنگام کار با Routeها، بی‌توجهی به ترتیب Routeها است.

برای مثال:


Route::get('/products/{product}', ...);



Route::get('/products/create', ...);

در چنین ساختاری ممکن است عبارت:


create

به‌عنوان مقدار {product} در نظر گرفته شود.

بنابراین در مواردی که Routeهای ثابت و پارامتری با یکدیگر تداخل دارند، باید ترتیب و ساختار Routeها را با دقت بررسی کرد.

برای مثال بهتر است Route مربوط به:


/products/create

قبل از Route پارامتری مربوط به:


/products/{product}

تعریف شود.


# اشتباهات رایج در Routeهای Laravel

1. استفاده از متد HTTP اشتباه

اگر Route به شکل:


Route::post('/products', ...);

تعریف شده باشد، ارسال GET به آن همان Route را اجرا نمی‌کند.


2. اشتباه در نام Route

اگر Route این نام را داشته باشد:


->name('products.index')

اما در View بنویسیم:


route('product.index')

با خطا مواجه خواهیم شد.


3. اشتباه در نام Parameter

اگر بنویسیم:


Route::get('/products/{product}', ...);

باید در جاهایی که نام پارامتر اهمیت دارد، همان ساختار را رعایت کنیم.


4. تعریف Route تکراری

اگر چند Route مشابه تعریف کنیم، ممکن است یکی از آن‌ها عملاً مورد استفاده قرار نگیرد یا رفتار غیرمنتظره‌ای ایجاد شود.


5. قرار دادن منطق زیاد داخل Route

برای مثال این کار در پروژه کوچک قابل قبول است:


Route::get('/hello', function () {

    return 'Hello';

});

اما قرار دادن منطق پیچیده کسب‌وکار داخل Route باعث شلوغ و سخت‌شدن کد می‌شود.

بهتر است منطق را به Controller، Service و بخش‌های مناسب معماری برنامه منتقل کنیم.


# بهترین روش برای ساخت Route در پروژه‌های واقعی

برای پروژه‌های کوچک می‌توان Routeهای ساده داشت:


Route::get('/about', function () {

    return view('about');

});

اما در پروژه‌های بزرگ‌تر بهتر است معماری منظم‌تری داشته باشیم:


Route

  ↓

Middleware

  ↓

Controller

  ↓

Service / Business Logic

  ↓

Model

  ↓

Database

  ↓

Response

Route باید تا حد امکان مسئولیت محدودی داشته باشد.

یعنی بیشتر وظیفه آن تعیین مسیر درخواست باشد، نه اجرای تمام منطق برنامه.


# جمع‌بندی Route در Laravel

Route یکی از مهم‌ترین مفاهیم Laravel است و مشخص می‌کند درخواست‌های HTTP چگونه وارد برنامه شوند و به کدام بخش از برنامه منتقل شوند.

در این مقاله با مفاهیم مهمی مانند موارد زیر آشنا شدیم:

  • Route چیست؟
  • فایل‌های Route در Laravel
  • Routeهای GET
  • Routeهای POST
  • PUT و PATCH
  • DELETE
  • Route Parameter
  • Optional Parameter
  • محدود کردن Parameter با where
  • Named Route
  • ساخت URL با route()
  • Redirect
  • Route Group
  • Prefix
  • Name Prefix
  • Middleware در Route
  • Resource Route
  • Route Model Binding
  • Fallback Route
  • php artisan route:list
  • Route Cache
  • تفاوت Routeهای Web و API
  • خطاهای رایج Routing
  • ساخت Routeهای CRUD

اگر Route را به‌خوبی یاد بگیرید، قدم بعدی این است که بدانید بعد از دریافت درخواست، Laravel چگونه منطق برنامه را به Controller منتقل می‌کند.

به همین دلیل مقاله بعدی این کلاستر به Controller در Laravel اختصاص دارد.


# سوالات متداول

Route در Laravel چیست؟

Route مشخص می‌کند یک درخواست HTTP با URL و متد مشخص باید به کدام بخش از برنامه Laravel ارسال شود.

Routeهای Laravel کجا قرار دارند؟

Routeهای وب معمولاً در ساختار routes و به‌خصوص routes/web.php تعریف می‌شوند. Routeهای API نیز در ساختار مربوط به API پروژه قرار می‌گیرند.

چگونه یک Route ساده در Laravel بسازیم؟

مثلاً:


Route::get('/hello', function () {

    return 'Hello Laravel';

});

Named Route چیست؟

Named Route به یک Route نام مشخص می‌دهد تا بتوانیم در بخش‌های مختلف برنامه به‌جای URL مستقیم، از نام Route استفاده کنیم.

مثلاً:


Route::get('/products', ...)

    ->name('products.index');

و سپس:


route('products.index')

Route Resource چه کاربردی دارد؟

Route::resource() برای ساخت مجموعه Routeهای استاندارد CRUD مربوط به یک Resource استفاده می‌شود و نیاز به تعریف دستی تمام Routeهای CRUD را کاهش می‌دهد.

Route Model Binding چیست؟

قابلیتی در Laravel است که اجازه می‌دهد پارامترهای Route به مدل‌های Eloquent متصل شوند تا پیدا کردن رکورد مربوطه ساده‌تر شود.

چگونه Routeهای Laravel را مشاهده کنیم؟

با دستور:


php artisan route:list

می‌توان Routeهای ثبت‌شده را بررسی کرد.

آیا می‌توان Middleware را روی Route قرار داد؟

بله. می‌توان Middleware را روی یک Route یا گروهی از Routeها اعمال کرد:


Route::middleware(['auth'])->group(function () {

    // routes

});

آیا می‌توان چند Route را در یک گروه قرار داد؟

بله. Route Group برای اعمال تنظیمات مشترک مانند Middleware، Prefix و Name Prefix بسیار کاربردی است.

آیا باید تمام منطق برنامه را داخل Route بنویسیم؟

خیر. در پروژه‌های واقعی بهتر است Route مسئول مسیریابی باشد و منطق برنامه در Controller، Service و سایر لایه‌های مناسب قرار گیرد.

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه