blade در لاراول

Blade

  • نمایش داده ها
    • خروجی امن
    • خروجی خام
  • شرط ها و حلقه ها
  • استفاده از کدهای php
    • استفاده از دستور @php
    • استفاده از دستور @php به‌صورت تک‌خطی
    • استفاده از دستور @use برای وارد کردن کلاس‌ها
    • استفاده از دستور @verbatim برای جلوگیری از پردازش Blade
  • وراثت در قالب
    • yeild
    • extends
    • sections
    • include
  • جاوا اسکریپت در blade

لاراول برای مدیریت ویوها از یک سیستم به نام blade استفاده میکند با استفاده از blade میتوان صفحات استاتیک html را به صفحات پویا تبدیل کزد و داخل هر ویو امکان استفاده از دستورات php فراهم میشود.blade سینتکس مخصوص به خود را دارد اما در نهایت به php تبدیل میشود

ویژگی‌های کلیدی Blade

  • نمایش داده‌ها

    • خروجی امن (Escaped): برای جلوگیری از حملات XSS، می‌توانید از دستور {{ }} برای نمایش داده‌ها استفاده کنید: در اینصورت متغییر مورد نظر یا تابع مورد نظر اجرا خواهد شد

    • خروجی خام (Unescaped): اگر نیاز به نمایش HTML خام دارید، از {!! !!} استفاده کنید در اینصورت تگ های html پردازش نمیشوند

نکته : برای جلوگیری از پردازش دابل کرلی بریس {{ }} میتوان قبل از ان یک @ قرار داد

  • شرط‌ها و حلقه‌ها

    • شرط‌ها:

@if($age >= 18)

شما بزرگ‌سال هستید.
@else

شما کودک هستید.
@endif

حلقه‌ها:

@for ($i = 0; $i < 5; $i++)
عدد: {{ $i }}
@endfor

مثال

نمایش تاریخ به سال

{{ date('Y'); }}

اتصال نام و نام خانوادگی

{{$name.' '.$family}}

  • استفاده از کدهای php
  1. استفاده از دستور @php

@php
$message = 'سلام!';
@endphp

{{ $message }}

۲. استفاده از دستور @php به‌صورت تک‌خطی

@php($counter = 0)

۳. استفاده از دستور @use برای وارد کردن کلاس‌ها

اگر نیاز به استفاده از یک کلاس درون نمای Blade دارید، می‌توانید از دستور @use استفاده کنید:

@use('App\Models\User')

۴. استفاده از دستور @verbatim برای جلوگیری از پردازش Blade

اگر نیاز به درج کدهایی دارید که شامل سینتکس Blade هستند و نمی‌خواهید توسط موتور Blade پردازش شوند، می‌توانید از دستور @verbatim استفاده کنید:

@verbatim
@if($success)
عملیات با موفقیت انجام شد.
@endif
@endverbatim

  • وراثت قالب‌هاBlade این امکان را می‌دهد که یک قالب اصلی تعریف کرده و در قالب‌های فرزند از آن استفاده کنید:

    • قالب اصلی (layouts/app.blade.php):

@yield('content')

    • قالب فرزند (home.blade.php):

@extends('layouts.app')

@section('title', 'خانه')

@section('content')

خوش آمدید به صفحه خانه
@endsection

  • شامل کردن نمای دیگر

برای گنجاندن یک نمای دیگر در نمای فعلی، از دستور @include استفاده کنید:

@include('partials.header')

جاوا اسکریپت در blade

  • پوشش دادن به استک‌ها
    • افزودن به استک:

برای افزودن محتوای اضافی مانند اسکریپت‌ها یا استایل‌ها در بخش‌های خاصی از قالب، از دستورات @push و @stack استفاده کنید:

@push('scripts')

@endpush

  • نمایش محتوای استک:

@stack('scripts')

  • دستور @inject

برای تزریق سرویس‌ها یا کلاس‌ها به نمای Blade، از دستور @inject استفاده کنید:

@inject('metrics', 'App\Services\MetricsService')

درآمد ماهانه: {{ $metrics->monthlyRevenue() }}

ارسال داده به View

روش ارسال داده به ویوتوضیحات
view('view.name', ['key' => 'value'])ارسال داده‌ها به ویو با استفاده از آرایهٔ کلید-مقدار.
view('view.name')->with('key', 'value')ارسال داده‌ها با استفاده از متد with برای اضافه کردن یک متغیر به ویو.
view('view.name')->with(['key1' => 'value1', 'key2' => 'value2'])ارسال چندین داده با استفاده از متد with به‌صورت آرایه.
view('view.name')->share('key', 'value')اشتراک‌گذاری داده‌ها برای دسترسی در تمامی ویوها.
view('view.name')->with(compact('variable'))ارسال متغیر به ویو با استفاده از تابع compact.
view('view.name', ['key' => $value])ارسال داده‌ها به ویو با استفاده از متغیرهای موجود در کنترلر.

📦 ارسال داده با استفاده از آرایهٔ کلید-مقدار

class aboutController extends Controller

{

function index(){

return view('about',['name'=>"kia","family"=>"moradi"]);

}

}

در اینجا، {{ $name }} و {{ $age }} به ترتیب مقدارهای James و 30 را نمایش می‌دهند.


this is about page
name={{ $name }} family={{ $family }}

استفاده از متد with

این متد برای ارسال یک یا چند داده به ویو استفاده می‌شود.

return view('greeting')
->with('name', 'James')
->with('age', 30);

استفاده از متد compact

این متد برای ارسال متغیرهایی که نام آن‌ها با کلیدهای آرایه هم‌نام هستند، استفاده می‌شود.

$name = 'James';
$age = 30;
return view('greeting', compact('name', 'age'));

اشتراک‌گذاری داده با تمام ویوها

گاهی ممکن است بخواهید داده‌ای را با تمام ویوهای اپلیکیشن به اشتراک بگذارید. برای این کار، می‌توانید از متد share استفاده کنید.

در فایل AppServiceProvider.php، متد boot را به‌صورت زیر تنظیم کنید:

public function boot()
{
View::share('appName', 'My Laravel App');
}

اکنون در هر ویو، می‌توانید به متغیر appName دسترسی داشته باشید

روش ارسال دادهتوضیحات
آرایهٔ کلید-مقدارساده‌ترین روش برای ارسال داده‌ها به ویو.
متد withمناسب برای ارسال یک یا چند داده به ویو.
متد compactمناسب زمانی که نام متغیرها با کلیدهای آرایه هم‌نام هستند.
متد shareبرای اشتراک‌گذاری داده‌ها با تمام ویوهای اپلیکیشن.

facades چیست

facade یک الگو طراحی است که با استفاده از ان میتوان بصورت استاتیک به کلاس های دیگر دسترسی داشت و نیازی نیست که برای ان یک شی جدید ایجاد شود

بدون facade:باید یک new بگیریم و بعد از شی استفاده کنیم

$app = app();
$cache = $app->make('cache');
$cache->put('key', 'value', $minutes);

با facade:نیازی به ساخت شی نیست و بصورت استاتیک در دسترس است

Cache::put('key', 'value', $minutes);

مزایای استفاده از Facadeها

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

  2. دسترسی آسان: نیاز به resolve کردن دستی اشیاء از container نیست

  3. تست‌پذیری: امکان Mock کردن آسان در تست‌ها

  4. یکپارچگی: رابط یکسانی برای سرویس‌های مختلف ارائه می‌دهد

Facadeهای معروف در لاراول

  • Cache - برای کار با سیستم کش

  • Auth - برای احراز هویت

  • DB - برای کار با پایگاه داده

  • Route - برای مسیریابی

  • Session - برای مدیریت sessionها

  • Storage - برای کار با فایل سیستم

view در لاراول

موضوعات

  • مفاهیم پایه view
  • موتور blade
  • ایجاد view
    • بصورت دستی
    • با استفاده از artisan
    • استفاده از Blade
    • پوشه بندی view ها
  • نمایش view
    • انتقال یک routeبه یک View
    • استفاده از View در یک controller
    • استفاده از کلاس View

view ها در لاراول وظیفه نمایش محتوا را بر عهده دارند . هر ویو مجموعه ای از کدهای html است که برای نمایش صفحات سایت استفاده میشود.view ها در مسیر resources/views ذخیره می شوند..معمولاً از viewها از پسوند .blade.php استفاده می‌شود

ایجاد view

بصورت دستی

در پوشه resource یک فایل با نام home.blade.php ایجاد میکنیم و محتوای html را در آن ذخیره میکنیم

مثال

< div>this is sample < /div>

با artisan

با استفاده از دستور زیر می توان با یک view با نام about در پوشه resource ایجاد کرد و سپس محتوای ان را به دلخواه تغییر داد

php artisan make:view about

استفاده از Blade

موتور blade : لاراول برای مدیریت قالب از موتور blade استفاده میکند این موتور باعث می شود بتوانیم در html از php استفاده کنیم مانند if ,for,while,... یا یک view را در داخل view دیگر مورد استفاده قرار دهیم

ویژگی‌های کلیدی Blade

  1. سینتکس ساده و خوانا: Blade از سینتکسی مشابه HTML استفاده می‌کند که یادگیری و استفاده از آن را آسان می‌سازد.

  2. کامپایل به PHP: تمامی قالب‌های Blade به کد PHP کامپایل می‌شوند و تا زمانی که تغییر کنند، کش می‌شوند. این ویژگی باعث می‌شود که Blade تقریباً هیچ سرباری به برنامه شما اضافه نکند.

  3. امنیت بالا: Blade به‌طور خودکار از حملات XSS (Cross-site scripting) جلوگیری می‌کند.

  4. ارث‌بری قالب‌ها: Blade به شما این امکان را می‌دهد که قالب‌های اصلی (Layouts) تعریف کنید و سپس قالب‌های دیگر را بر اساس آن‌ها ایجاد کنید. این ویژگی از تکرار کد جلوگیری می‌کند و باعث می‌شود تغییرات در ساختار کلی سایت به راحتی اعمال شود.

مثال :فایل post.blade.php راایجاد و داخل ان از سینتکس blade استفاده میکنیم که در نهایت به یک فایل php تبدیل میشود

@foreach ($posts as $post)
{{ $post->title }}
@endforeach

پوشه بندی view ها

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

ایجاد ویو about در داخل پوشه home

php artisan make:view home.about

دسترسی به ویو داخل پوشه

return(view('home.about'))


نمایش View

با استفاده از view

برای نمایش یک ویو میتوان انرا در route استفاده کرد

Route::view('/', 'about');

با استفاده از controller

class aboutController extends Controller{
function index(){
return view('about');
}
}

Route::get('/about',[aboutController::class,'index']);

استفاده از کلاس View

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

مثال:

class aboutController extends Controller{
function index(){
return View::make('about');
}
}

Route::get('/about',[aboutController::class,'index']);

مهمترین متدهای Facade View

دسته‌بندیمتدتوضیحاتمثال
متدهای اصلیmake()ایجاد یک view جدید با داده‌های اختیاریView::make('view.name', ['key' => 'value'])
first()نمایش اولین view موجود از لیست داده شدهView::first(['custom.view', 'default.view'], $data)
exists()بررسی وجود viewif(View::exists('view.name')) { ... }
متدهای زنجیره‌ایwith()افزودن داده به view (تکی یا آرایه)View::make('view')->with('name','John')->with('age',30)
withErrors()افزودن خطاهای اعتبارسنجی به viewView::make('form')->withErrors($validator)
متدهای NamespaceaddNamespace()ثبت namespace جدید برای viewهاView::addNamespace('admin', resource_path('views/admin'))
prependNamespace()اضافه کردن namespace به ابتدای لیستView::prependNamespace('admin', alternative_path())
متدهای پیشرفتهshare()اشتراک داده بین تمام viewهاView::share('siteName','MySite')
composer()ثبت view composer (اجرا پس از ایجاد view)View::composer('profile', fn($view) => $view->with('count', 5))
creator()ثبت view creator (اجرا قبل از ایجاد view)View::creator('profile', ProfileCreator::class)
متدهای رندرrender()رندر view به صورت رشته$html = View::make('view')->render()
renderEach()رندر تکراری یک view برای آیتم‌های داده شدهView::renderEach('view.item', $items, 'item')

ایجاد یک کنترلر برای عملیات CRUD

موضوعات

  • مفاهیم پایه CRUD
  • ایجاد کنترلر و مسیرهای مربوطه بصورت دستی
  • ایجاد خودکار کنترلر و متدها توسط لاراول
  • ایجاد خودکار مسیرها توسط لاراول
    • استثنا کردن برخی مسیر
    • تنها برخی از مسیرهای ایجاد شود
  • ایجاد کنترلر برای api
  • ایجاد روت برای api

عملیات CRUD (مخفف Create، Read، Update، Delete) چهار عمل اصلی هستند که در برنامه‌نویسی و مدیریت پایگاه داده‌ها برای ایجاد، خواندن، به‌روزرسانی و حذف داده‌ها به‌کار می‌روند. این عملیات پایه‌ای‌ترین و اساسی‌ترین وظایف در هر سیستم مدیریت پایگاه داده یا API محسوب می‌شوند

هر کنترلر CRUD باید 7 متد است

شمارهمتدURIمتد کنترلرکاربردنام مسیر
1GET/postsindexنمایش لیست پستهاposts.index
2GET/posts/createcreateنمایش فرم ایجاد پستposts.create
3POST/postsstoreذخیره پست جدیدposts.store
4GET/posts/{post}showنمایش یک پستposts.show
5GET/posts/{post}/editeditنمایش فرم ویرایشposts.edit
6PUT/posts/{post}updateبه‌روزرسانی پستposts.update
7DELETE/posts/{post}destroyحذف پستposts.destroy

class postController extends Controller

{

function index(){

}

function create(){

}

function show(){

}

function store(){

}

function edit(){

}

function update(){

}

function destroy(){

}

}

مسیرها

Route::controller(postController::class)->group(function(){

Route::get('/post/index','index');

Route::get('/post/create','create');

Route::get('/post/show','show');

Route::get('/post/edit','edit');

Route::put('/post/update','update');

Route::post('/post/store','store');

Route::delete('/post/destroy','destroy');

}

در لاراول برای راحتی میتوان از دستور زیر برای ساخت خودکار کنترلر استفاده کرد

php artisan make:controller postController --resource

این دستور مسیرهای مورد نیاز را بصورت خودکار ایجاد میکند

route::resource('posts',postController::class);

مشاهده روت های موجود

php artisan route:list

حذف برخی روت ها

route::resource('posts',postController::class)->except(['edit','create']);

ایجاد روتهای مشخص

route::resource('posts',postController::class)->only(['edit','create']);

ایجاد کنترلر برای api

php artisan make:controller postController --api

فرق بین resource و api در این است که در هنگام استفاده از api نیازی به create(فرم ساخت ) و edit(فرم ویرایش) نداریم زیرا فرم ها در برنامه کلاینت وجود دارد و تنها json استفاده می شود

ایجاد روت برای api

route::apiResource('posts',postController::class);

ارجاع یک مسیر به یک کنترلر

موضوعات

  • ارجاع یک مسیر به یک کنترلر
  • ارجاع یک مسیر به یک کنترلر با پارامتر
  • ارجاع یک مسیر به کنترلر با پارامتر اختیاری
  • اعمال فیلتر روی پارامترهای ورودی
  • گروهبندی مسیرهای یک کنترلر

🔄 ارجاع یک مسیر به یک کنترلر

  • تعریف کنترلر

namespace App\Http\Controllers;

class calcController extends Controller

{

function sum(){

return 2+6;

}

}

  • تعریف روتر

Route::get('/sum/', [calcController::class, 'sum']);

  • اجرا

http://localhost:8000/sum/

🔄 ارجاع یک مسیر به یک کنترلر با پارامتر

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

  • تعریف کنترلر

namespace App\Http\Controllers;

class calcController extends Controller

{

function sum(string $num1,string $num2){

return $num1+$num2;

}

}

  • تعریف روتر

Route::get('/sum/{num1}/{num2}', [calcController::class, 'sum']);

  • اجرا

http://localhost:8000/sum/2/6

ارجاع یک مسیر به کنترلر با پارامتر اختیاری

با قرار دادن علامت ؟ در

  • تعریف کنترلر

namespace App\Http\Controllers;

class calcController extends Controller

{

function sum(string $num1,string $num2=6){

return $num1+$num2;

}

}

  • تعریف روتر

Route::get('/sum/{num1}/{num2?}', [calcController::class, 'sum']);

  • اجرا

http://localhost:8000/sum/2

پارامتر num2 اختیاری است و در صورتکیه ارسال نشود پیش فرض 6 جایگزین خواهد شد

اعمال فیلتر روی پارامترهای ورودی

Route::get('/sum/{num1}/{num2}', [calcController::class, 'sum'])->whereNumber(num1)->whereNumber(num2)

Route::get('/sum/{num1}/{num2}', [calcController::class, 'sum'])->whereNumber([num1,num2])

گروه بندی ارجاع به یک کنترلر

در نظر داشته باشید میخواهیم سیستم یک ماشین را پیاده سازی کنیم این ماشین میتواند روشن شود خاموش شود و گاز بدهد و ترمز کند

ابتدا یک کنترلر با نام carتعریف میکنیم سپس با استفاده از مسیرهای مختلف و مدل mvc انر اجرا میکنیم

توضیحاتroute
برای روشن شدن ماشینhttp://localhost/car/strat
برای خاموش شدن ماشینhttp://localhost/car/stop
برای گاز خوردنhttp://localhost/car/gas
برای ترمز ماشینhttp://localhost/car/break

ایجاد روترهای مرتبط

Route::get('/car/start',[carController::class,'start']);

Route::get('/car/stop',[carController::class,'stop']);

Route::get('/car/gas',[carController::class,'gas']);

Route::get('/car/break',[carController::class,'break']);

با استفاده از گروه بندی میتوانیم کد را ساده تر کنیم زیرا همه مسیر های بالا با car شروع می شوند

Route::controller(carController::class)->group(function(){

Route::get('/car/start','start');

Route::get('/car/stop','stop');

Route::get('/car/gas','gas');

Route::get('/car/break','break');

}

  • تمام مسیرهای مرتبط با ماشین در یک متمرکز می‌شوند

  • نام کنترلر فقط یک بار مشخص می‌شود

  • خوانایی کد افزایش می‌یابد

کار با کنترلرها

در لاراول، کنترلرها (Controllers) کلاس‌هایی هستند که مسئول پردازش درخواست‌های ورودی و بازگرداندن پاسخ مناسب به کاربر می‌باشند. استفاده از کنترلرها به شما این امکان را می‌دهد که منطق برنامه را از فایل‌های مسیریابی (routes) جدا کرده و ساختار کد را سازمان‌دهی کنید.
یکی از سه عنصر اصلی الگوی طراحی MVC کنترلرها هستند. در فایلrouting.php میتوانیم درخواستها را به یک کنترلر و اکشن خاصی ارسال کنیم به طور مثالآ ادرس

http://www.example.com/user/5


در مثال زیر یک مسیر به کنترلر UserController و اکشن showProfile هدایت میکند.


Route::get('user/{id}', [UserController::class, 'showProfile']);

🛠️ ایجاد کنترلر در لاراول

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

php artisan make:controller UserController

این دستور یک فایل کنترلر با نام UserController.php در مسیر app/Http/Controllers ایجاد می‌کند. در داخل این فایل، می‌توانید متدهایی برای پردازش درخواست‌های مختلف تعریف کنید:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
public function index()
{
return 'لیست کاربران';
}
}


مثال :

  1. تعریف یک کنترلر که دارای دو اکشن sum , sub است که دو ورودی دریافت کرده و نتیجه تفریق یا جمع انها را بازمیگرداند

namespace App\Http\Controllers;

class calcController extends Controller

{

function sum(float $num1,float $num2){

return $num1+$num2;

}

function sub(float $num1,float $num2){

return $num1-$num2;

}

}

2.ایجاد یک روتر :

در روتر زیر دو پارامتر num1,num2 از طریق متد get دریافت میشود و سپس اکشن sum از کنترلر calcController فراخوانی میشود

Route::get('/sum/{num1}/{num2}', [calcController::class, 'sum'])

در روتر زیر دو پارامتر num1,num2 از طریق متد get دریافت میشود و سپس اکشن sub از کنترلر calcController فراخوانی میشود

Route::get('/sub/{num1}/{num2}', [calcController::class, 'sub'])

3.فیلتر کردن ورودی ها:

ممکن از موارد دریافتی از url عدد نباشند بنابراین باید از عدد بودن انها اطمینان حاصل کنیم

Route::get('/sum/{num1}/{num2}', [calcController::class, 'sum'])->whereNumber(['num1','num2']);

Route::get('/sub/{num1}/{num2}', [calcController::class, 'sub'])->whereNumber('num1')->whereNumber('num2');


🔄 استفاده از کنترلر در فایل مسیرها (routes)

برای ارتباط مسیرها با کنترلرها، می‌توانید از متد Route::resource استفاده کنید:

ساخت کنترلر کاربر با 7 متد پیش فرض

php artisan make:controller UserController --recource

use App\Http\Controllers\UserController;

Route::resource('users', UserController::class);

این دستور به‌صورت خودکار مسیرهای زیر را برای عملیات‌های مختلف ایجاد می‌کند:

متدURIمتد کنترلرنام مسیر
GET/postsindexposts.index
GET/posts/createcreateposts.create
POST/postsstoreposts.store
GET/posts/{post}showposts.show
GET/posts/{post}/editeditposts.edit
PUT/posts/{post}updateposts.update
DELETE/posts/{post}destroyposts.destroy

محدود کردن متدها

Route::resource('users', UserController::class)->only([
'index', 'show', 'store'
]);

حذف متدهای خاص

Route::resource('users', UserController::class)->except([
'create', 'edit', 'destroy'
]);

تغییر نام پارامتر

Route::resource('users', UserController::class)->parameters([
'users' => 'member'
]);
// حالا URIها به شکل /users/{member} خواهند بود

تغییر نام مسیرها

Route::resource('users', UserController::class)->names([
'index' => 'users.list',
'show' => 'users.view'
]);

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

php artisan route:list

استفاده با Route::apiResource

برای APIها می‌توانید از apiResource استفاده کنید که مسیرهای create و edit را ایجاد نمی‌کند زیرا در Api نیازی به ایجاد و نمایش فرم نداریم و کار از طریق json انجام میشود(فرم در کلاینت وجود دارد)

php artisan make:controller UserController --api

Route::apiResource('users', UserController::class);

🧩 کنترلرهای تک‌عملیاتی (Single Action Controllers)

اگر کنترلری فقط یک متد دارد، می‌توانید از کنترلرهای تک‌عملیاتی استفاده کنید:

php artisan make:controller ShowUser --invokable

این دستور یک کنترلر با متد __invoke ایجاد می‌کند که می‌توانید از آن در مسیرها استفاده کنید:

use App\Http\Controllers\ShowUser;

Route::get('user/{id}', ShowUser::class);

🧩 تزریق وابستگی‌ها (Dependency Injection) در کنترلرها

لاراول از Service Container برای تزریق وابستگی‌ها به کنترلرها استفاده می‌کند. می‌توانید وابستگی‌ها را در سازنده کنترلر یا متدهای آن تعریف کنید:

تزریق وابستگی در سازنده:

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
public function __construct(UserRepository $userRepo)
{
$this->userRepo = $userRepo;
}

public function index()
{
$users = $this->userRepo->getAllUsers();
return view('users.index', compact('users'));
}
}

تزریق وابستگی در متد:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
public function store(Request $request)
{
// ذخیره‌سازی کاربر جدید
}
}

مدل mvc

الگوی معماری MVC (Model-View-Controller) یک الگوی طراحی نرم‌افزاری است که برای ساختاردهی برنامه‌های کاربردی به‌ویژه در توسعه وب استفاده می‌شود. این الگو برنامه را به سه بخش اصلی تقسیم می‌کند که هرکدام مسئولیت‌های خاص خود را دارند:کدیتی+2تحت توسعه+2itroz+2کدیتی+1تحت توسعه+1

🧩 اجزای معماری MVC

  1. مدل (Model)
    مدل مسئول مدیریت داده‌ها و منطق کسب‌وکار است. این بخش با پایگاه داده در ارتباط است و وظیفه ذخیره و بازیابی داده‌ها را بر عهده دارد. مدل هیچ اطلاعی درباره رابط کاربری ندارد و تنها بر روی داده‌ها و منطق تمرکز می‌کند.

  2. نما (View)
    نما بخش رابط کاربری برنامه است. این بخش اطلاعات را از مدل دریافت کرده و آن‌ها را به صورت قابل مشاهده به کاربر نمایش می‌دهد. نما تنها وظیفه نمایش داده‌ها را دارد و نباید هیچ منطق کسب‌وکار در آن قرار داشته باشد.

  3. کنترل‌گر (Controller)
    کنترل‌گر مسئول واکنش به درخواست‌های کاربر و تعامل بین مدل و نما است. کنترل‌گر ورودی‌های کاربر را پردازش می‌کند، با مدل تعامل دارد و نتیجه را به نما ارسال می‌کند. به عبارت دیگر، کنترل‌گر مغز متفکر برنامه است که بین مدل و نما پل می‌زند.

میان‌افزار (Middleware)

در لاراول، میان‌افزار (Middleware) یک لایه واسط است که بین درخواست HTTP و پاسخ آن قرار می‌گیرد و به شما این امکان را می‌دهد که منطق‌هایی مانند احراز هویت، محدودیت دسترسی، مدیریت نشست‌ها، و اعتبارسنجی CSRF را به راحتی پیاده‌سازی کنید.

انواع میان‌افزارها در لاراول

  1. میان‌افزار سراسری (Global Middleware)
    این میان‌افزار برای هر درخواست HTTP در برنامه اجرا می‌شود. برای اضافه کردن آن، باید کلاس میان‌افزار را در آرایه $middleware در فایل app/Http/Kernel.php ثبت کنید.

  2. میان‌افزار مسیر (Route Middleware)
    این میان‌افزارها به مسیرهای خاصی اختصاص داده می‌شوند. برای استفاده از آن‌ها، ابتدا باید در آرایه $routeMiddleware در Kernel.php تعریف شوند و سپس با استفاده از متد middleware به مسیرها اختصاص یابند.

  3. گروه‌های میان‌افزار (Middleware Groups)
    لاراول به‌صورت پیش‌فرض دو گروه میان‌افزار web و api را ارائه می‌دهد که می‌توانید آن‌ها را در آرایه $middlewareGroups در Kernel.php مشاهده و مدیریت کنید.

  4. اولویت‌بندی میان‌افزارها (Middleware Priority)

  5. در مواقعی که ترتیب اجرای میان‌افزارها اهمیت دارد، می‌توانید با استفاده از آرایه $middlewarePriority در Kernel.php ترتیب اجرای آن‌ها را مشخص کنید.

    مثال

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

php artisan make:middleware CheckAge

سپس در متد handle این کلاس، منطق مورد نظر را پیاده‌سازی کنید:

public function handle($request, Closure $next)
{
if (auth()->user()->age < 18) {
return redirect('home');
}

return $next($request);
}

برای استفاده از این میان‌افزار، آن را در آرایه $routeMiddleware در Kernel.php ثبت کرده و سپس به مسیرها اختصاص دهید:

Route::get('/profile', function () {
// ...
})->middleware('checkAge');

مسیریابی در لاراول

فهرست

  • مفاهیم پایه مسیریابی
  • استفاده از چند متد مسیریابی بصورت همزمان
  • انتقال به سایر مسیر ها
  • انتقال به یک view
  • مسیریابی با پرامتر
  • مسیریابی با پارمتر اختیاری
  • اعتبارسنجی پارامترها در مسیریابی
    • whereNumber
    • whereAlpha
    • whereAlphaNumberic
    • whereIn
    • where
  • نامگذاری برای مسیرها
  • گروهبندی مسیرها
  • مسیرهای خطا
  • مشاهده لیست مسیرها
  • کش کردن مسیرها

(Routing) به فرآیند هدایت درخواست‌های کاربر به منابع مناسب در سرور را مسیر دهی می گویند بعنوان مثال کاربر می‌خواهد مشخصات یک محصول را مشاهده کند

http://local/product/12

در لاراول، مفهوم مسیردهی (Routing) به شما این امکان را می‌دهد که درخواست‌های ورودی (URLها) را به کنترلرها یا نمای (View)های مناسب هدایت کنید یا دستورات مناسب را بر اساس مسیر اجرا کنید

  • اجرای یک تابع
  • اجرای یک متد از controller
  • نمایش یک view

متدهای route

با استفاده از متدهای زیر میتونیم مسیر های دلخواه را از کاربر دریافت کنیم

برای دریافت اطلاعات از url استفاده میشودroute::get($uri,$callback)
برای ایجاد اطلاعات از post استفاده میشودroute::post($uri,$callback)
برای بروزرسانی اطلاعات استفاده میشودroute::put($uri,$callback)
برای بروزرسانی اطلاعات استفاده میشودroute::patch($uri,$callback)
برای حذف اطلاعات استفاده میشودroute::delete($uri,$callback)
برای دریافت اطلاعات بیشتر درباره یک روت مشخص استفاده میشودroute::options($uri,$callback)

انواع مسیر دهی در لاراول

1. مسیردهی ساده ،نمایش یک view مشخص برای تعریف یک مسیر ساده، می‌توان از متدهای HTTP مانند get، post، put، delete و patch استفاده کرد:

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

در این مثال، درخواست مسیر /about به نمای about.blade.php هدایت می‌شود.

2. مسیردهی با پارامتر

برای دریافت پارامتر از URL، می‌توان از متغیرهای درون آکولاد استفاده کرد:

Route::get('/user/{id}', function ($id) {
return 'User ' . $id;
});

در این مثال، مقدار id از URL استخراج شده و در متغیر $id قرار می‌گیرد.

2.1.فیلتر کردن پارامترها

برای فیلتر کردن میتوانیم از where استفاده کنیم

  • whereNumber بررسی میکند ورودی مورد نظر تنها عدد باشد
  • WhereAlpha بررسی میکند ورودی مورد نظر رشته باشد
  • whereAlphaNumeric هم عدد و هم رشته باشد
  • where از عبارت regx استفاده میکند

مثال:

Route::get('/user/{id}', function ($id) {
return 'User ' . $id;
})->whereNumber('id')

مثال:در درخواست ارسالی id باید عددی باشد و message رشته ای

Route::get('/user/{id}/message/{string}', function ($id,$string) {
return 'User :' . $id.'message:'.$string;
})->whereNumber('id')->WhereAlpha ('string')

مثال:در درخواست ارسالی نام کاربری فقط حروف کوچک و بزرگ باشد

Route::get('/user/{userName}',function($userName){
//
})->where('userName',[a-Z]+)

مثال:ایجاد محدودیت برای زبان و شناسه درخواستی

Route::get('/{lang}/page/{id}',function($lang,$id){
//
})->where(['lang'=>'[a-z]{2}','id'=>'\d{4,}')

مثال: امکان تکرار هر کراکتر حتی / داخل درخواست

Route::get('/search/{search}',function($search){
return($search)
})->where(['search'=>'.+')

3.مسیردهی به کنترلر:اجرای یک متد از یک کنترولر

برای هدایت درخواست‌ها به متدهای کنترلر، استفاده می شود

Route::get('/posts', [PostController::class, 'index']);

در اینجا، درخواست مسیر /posts به متد index در PostController هدایت می‌شود.

4.مسیردهی با نام (Named Routes)

برای نام‌گذاری مسیرها و استفاده از آن‌ها در سایر بخش‌های برنامه، می‌توان از متد name استفاده کرد:

4.1. جلوگیری از تکرار URLها در کد (DRY Principle)

به جای استفاده مستقیم از آدرس‌ها در چندین بخش برنامه (مثل لینک‌ها، ریدایرکتها و ...)، از نام مسیر استفاده می‌کنیم تا اگر URL تغییر کرد، فقط نیاز به اصلاح در یک مکان باشد.

بدون Named Route (مشکل تکرار و خطا):اگر /post را تغییر دهیم باید در تمام لینک ها تغییر ایجاد کنیم

نمایش پست

با Named Route (کد تمیز و قابل مدیریت):در صورت نیتز به تغییر تنها روت را تغییر میدهیم

Route::get('/posts/{slug}', [PostController::class, 'show'])->name('posts.show');
نمایش پست

4.2. ریدایرکت‌های آسان (Redirects)

می‌توانید به جای آدرس‌دهی مستقیم، از نام مسیر برای ریدایرکت استفاده کنید.

return redirect()->route('profile', ['id' => 1]);

برای تولید URL مربوط به این مسیر، می‌توان از تابع route استفاده کرد:

4.3. استفاده در فرم‌ها (Form Actions)

Route::post('/posts', [PostController::class, 'store'])->name('posts.store');


@csrf

ذخیره

5.مسیردهی در کنترلرها (Controller Routes)

return redirect()->route('dashboard');

6. مسیردهی با گروه‌بندی

برای گروه‌بندی مسیرها با ویژگی‌های مشترک مانند پیشوند URL، نام مشترک یا میانه‌افزار (Middleware)، می‌توان از متد prefix، name و middleware استفاده کرد:

مثال: تمامی مسیرهای داخل گروه با پیشوند /admin خواهند بود.

Route::prefix('admin')->group(function () {
Route::get('/dashboard', function () {
// ...
});
});

7.مسیردهی پیش‌فرض (Fallback Routes)

برای تعریف مسیری که در صورت عدم تطابق سایر مسیرها با درخواست، اجرا شود، می‌توان از متد fallback استفاده کرد:

Route::fallback(function () {
return view('404');
});

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

8.مسیریابی که شامل چندین روت همزمان باشد

Route دارای متدی به نام matchهست که می توانیم چندنوع درخواستhttp را به یک مسیر مجاز کنیم در مثال زیر مسیر هر دونوع درخواست GETوPOSTراقبول میکند:


Route::match(['get', 'post'], '/', function()
{
return 'Hello World';
});

9.مسیریابی که شامل همه روت همزمان باشد
در صورتیکه بخواهیم همه خواستها راقبول کنید از متد any استفاده میکنیم مثال http://www.example.com/foo هر درخواستی را قبول میکند:


Route::any('foo', function()
{
return 'Hello World';
});

9.1.مسیریابی انتقال

برای انتقال یک درخواست به مسیر دیگر از redirect استفاده می شود

Route::redirect('/home','/')

مسیر / را به مسیر /home تغییر میدهد

9.2.مسیریابی به یک view

Route::view('/contact','contact')

با مراجعه به مسیر contact/ ویوی contact نمایش داده میشود

9.3.ارسال پارامتر به view

Route::view('/contact','contact',['userId'=>'258'])

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

متد/ویژگینحوه استفادهکاربردمثال
مسیرهای پایه
get()Route::get(uri, callback)تعریف مسیر GETRoute::get('/users', fn() => 'Users List')
post()Route::post(uri, callback)تعریف مسیر POSTRoute::post('/users', [UserController::class, 'store'])
any()Route::any(uri, callback)پاسخ به همه متدهای HTTPRoute::any('/contact', ContactController::class)
match()Route::match(methods, uri, callback)پاسخ به چند متد خاصRoute::match(['get', 'post'], '/login', [AuthController::class, 'login'])
مسیرهای Resource
resource()Route::resource(uri, controller)ایجاد تمام مسیرهای CRUDRoute::resource('users', UserController::class)
apiResource()Route::apiResource(uri, controller)ایجاد مسیرهای API (بدون create/edit)Route::apiResource('posts', PostController::class)
نام‌گذاری مسیرها
name()Route::...->name('route.name')اختصاص نام به مسیرRoute::get('/profile', fn() => ...)->name('profile')
محدودیت‌ها
where()Route::...->where('param', 'regex')اعتبارسنجی پارامترهاRoute::get('/user/{id}', ...)->where('id', '[0-9]+')
middleware()Route::...->middleware('middleware')اعمال میدلورRoute::get('/admin', ...)->middleware('auth')
پیشوند و گروه‌بندی
prefix()Route::prefix('admin')->group(...)اضافه کردن پیشوند به URIRoute::prefix('api')->group(...)
group()Route::group([options], callback)گروه‌بندی مسیرهاRoute::group(['middleware' => 'auth'], fn() => { ... })
Route Model Binding
مدل در پارامترRoute::get('/users/{user}', ...)تزریق خودکار مدلRoute::get('/users/{user}', fn(User $user) => ...)
متدهای کمکی
view()Route::view(uri, view, [data])بازگرداندن view بدون کنترلرRoute::view('/welcome', 'welcome')
redirect()Route::redirect(from, to, status)ریدایرکتRoute::redirect('/here', '/there')
permanentRedirect()Route::permanentRedirect(from, to)ریدایرکت دائم (301)Route::permanentRedirect('/old', '/new')