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');

}

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

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

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