آموزش لاراول 7 برای مبتدیان - blade-templates

  • مقدمه
  • Template ارث بری
    •  تعریف یک  Layout
    • گسترش یک Layout
  • نمایش داده ها
    • فریم ورک های Blade & JavaScript 
  • ساختار کنترل
    • If Statements
    • Switch Statements
    • Loops
    •  Loop Variable
    • Comments
    • PHP
  • فرم ها
    • CSRF Field
    • Method Field
    • Validation Errors
  • اجزاء
    • Displaying Components
    • Passing Data To Components
    • Managing Attributes
    • Slots
    • Inline Component Views
    • Anonymous Components
  • Including Subviews
    • Rendering Views For Collections
  • Stacks
  • Service Injection
  • Extending Blade
    • Custom If Statements

مقدمه

Blade  ساده است اما templating engine قدرتمندی را با لاراول پیاده کرده است.برخلاف سایر انجین های PHP Template، اما Blade شما را به استفاده از کد PHP ساده در view های خود محدود نمی کند.در واقع ، تمام Blade view ها به کد ساده PHP کامپایل می شوند و تا زمانی که اصلاح نشوند ، کش می شوند ، به این معنی که Blade اساساً overhead یی به برنامه شما اضافه نمی کند. فایلهای  Blade view از فایلی با پسوند .blade.php  استفاده می کنند و به طور معمول در دایرکتوری resources/views ذخیره می شوند.

Template وراثت

تعریف یک Layout

دو مورد از مزایای اصلی استفاده از Blade ، وراثت الگوها و بخش ها است.برای شروع ، اجازه دهید یک مثال ساده را مرور کنیم. ابتدا طرح صفحه "master" را بررسی خواهیم کرد. از آنجا که بیشتر برنامه های وب همان طرح کلی را در بین صفحات مختلف حفظ می کنند ، تعریف این طرح به عنوان یک Blade view مناسب است:

همانطور که مشاهده می کنید ، این فایل حاوی نشانه گذاری HTML معمولی است. با این حال ، به دستور های @section و @yield توجه کنید. دستور@section همانطور که از نام آن پیداست ، بخشی از محتوا را تعریف می کند ، در حالی که دستور @yield برای نمایش محتوای یک بخش مشخص استفاده می شود.


اکنون که ما یک طرح برای برنامه خود تعریف کرده ایم ، بیایید یک صفحه child را تعریف کنیم که از این layout ارث بری می کند.

گسترش یک Layout

هنگام تعریف child view ، از دستورالعمل Blade @extends استفاده کنید تا مشخص کنید که کدام child view باید inherit داشته باشد. view هایی که یک Blade layout را گسترش می دهند با استفاده از دستورهای@section می توانند محتوا را به بخش های layout اضافه کنند. به یاد داشته باشید ، همانطور که در مثال بالا مشاهده می شود ، مطالب این بخش ها با استفاده از @yield در layout نمایش داده می شوند:

در این مثال ، بخش sidebar با استفاده از دستور @parent برای اضافه کردن مطالب (به جای نوشتن متن) در sidebar طرح قرار دارد. دستور @parent هنگام ارائه view جایگزین محتوای layout می شود.

نکته: برخلاف مثال قبلی ، این بخش sidebar به جای@show با @endsection به پایان می رسد. دستورالعمل@endsection فقط یک بخش را تعریف می کند در حالی که@show بخش را تعریف و immediately yield می کند.

دستور @yield همچنین یک مقدار پیش فرض را به عنوان پارامتر دوم خود می پذیرد. در صورت عدم تعریف yielded ، این مقدار ارائه می شود:

@yield('content', View::make('view.name'))

Blade views ممکن است از مسیرهایی با از global view helper برگردانده شود :

Route::get('blade', function () {
    return view('child');
});

نمایش داده ها

شما می توانید با قرار دادن متغیر{} ، داده های منتقل شده به blade view های خود را نمایش دهید. به عنوان مثال :

Route::get('greeting', function () {
    return view('welcome', ['name' =‌>‌ 'Samantha']);
});

شما می توانید محتویات متغیر name را به صورت زیر نمایش دهید:

Hello, {{ $name }}.

نکته: عبارات Blade {{ }} اتومات از طریق تابع PHP's htmlspecialchars برای جلوگیری از حملات XSS ارسال می شوند.

شما محدود به نمایش محتوای متغیرهای ارسال شده به view نیستید. همچنین می توانید نتایج توابع PHP را چاپ کنید. در واقع ، می توانید هر کد PHP مورد نظر خود را در داخل یک عبارت Blade echo قرار دهید:

The current UNIX timestamp is {{ time() }}.

نمایش داده های Unescaped 

به طور پیش فرض ، عبارات Blade {{ }} به طور خودکار از طریق تابع PHP's htmlspecialchars برای جلوگیری از حملات XSS ارسال می شوند. اگر نمی خواهید داده های شما escape کنند ، می توانید از دستور زیر استفاده کنید:

Hello, {!! $name !!}.

هنگام echo محتوایی که توسط کاربران برنامه شما ارائه می شود ، بسیار دقت کنید. برای جلوگیری از حملات XSS هنگام نمایش داده های ارائه شده توسط کاربر ، همیشه از syntax  {} استفاده کنید.

Rendering JSON

گاهی اوقات ممکن است آرایه ای را به view به عنوان JSON به صورت یک متغیر JavaScript ارسال کنید. مثلا:

‌<‌‌script‌>‌
    var app = ‌<‌?php echo json_encode($array); ?‌>‌;
‌<‌/script‌‌>‌

باید از دستور @json برای ارائه متغیرهای موجود به عنوان JSON استفاده کنید. Blade templating مبتنی بر regular expressions است و تلاش برای ارسال complex expression به دستور ممکن است باعث شکستهای غیر منتظره شود.

دستور @json همچنین برای کامپوننت هایseeding Vue یا ویژگی های *-data مفید است:

‌<‌example-component :some-prop='@json($array)'‌>‌‌<‌/example-component‌>‌

HTML Entity Encoding

به طور پیش فرض ، Blade (و  Laravel e helper) کد HTML را دابل encode می کند. اگر می خواهید  دابل encode را غیرفعال کنید ، متد Blade::withoutDoubleEncoding از متد boot  از AppServiceProvider را فراخوانی کنید:

فریم ورک های Blade و JavaScript 

از آنجا که در بسیاری از فریم ورک های جاوا اسکریپت از {} نیز استفاده می شود تا بیان شود که عبارتی باید در مرورگر نمایش داده شود ، می توانید از نماد @ استفاده کنید. مثلا:

‌‌<‌‌h1‌‌>‌‌Laravel‌‌<‌‌/h1‌‌>‌‌

Hello, @{{ name }}.

در این مثال ، نماد @ توسط Blade حذف خواهد شد. با این حال ، عبارت {{ name }} توسط Blade engine دست نخورده باقی خواهد ماند و اجازه می دهد توسط فریم ورک JavaScript شما ارائه شود.

دستور @verbatim 

اگر متغیرهای جاوا اسکریپت را در بخش بزرگی از template خود نمایش می دهید ، می توانید HTML را در دستور @verbatim قرار دهید تا مجبور نشوید برای پیشوند هر statement blade یک نماد @ اضافه کنید:

@verbatim
    ‌<‌div class="container"‌>‌
        Hello, {{ name }}.
    ‌<‌/div‌>‌
@endverbatim

ساختار کنترل

علاوه بر ارث بری template و نمایش داده ها ، Blade میانبرهای مناسبی را برای ساختارهای کنترل معمول PHP مانند دستورات شرطی و حلقه ها نیز فراهم می کند. این میانبرها روشی بسیار تمیز و مختصر با ساختارهای کنترل PHP را ارائه می دهند.

If Statements

می توانید دستورات if را با استفاده از دستورهای@if@elseif@elseو @endif بسازید.

@if (count($records) === 1)
    I have one record!
@elseif (count($records) ‌>‌ 1)
    I have multiple records!
@else
    I don't have any records!
@endif

برای راحتی ، Blade همچنین دستور@unless را ارائه می دهد:

@unless (Auth::check())
    You are not signed in.
@endunless

علاوه بر دستورهای شرطی که قبلاً بحث شد ، دستور @isset و @empty می توانند به عنوان میانبرهای مناسب برای توابع PHP مورد استفاده قرار گیرند:

@isset($records)
    // $records is defined and is not null...
@endisset

@empty($records)
    // $records is "empty"...
@endempty

Authentication Directives

از دستورهای @guest و @auth می توان برای تشخیص سریع احراز هویت کاربر جاری یا مهمان بودن استفاده کرد:

@auth
    // The user is authenticated...
@endauth

@guest
    // The user is not authenticated...
@endguest

در صورت نیاز ، می توانید authentication guard تعیین کنید که باید هنگام استفاده از دستورهای@guest و @auth بررسی شود:

@auth('admin')
    // The user is authenticated...
@endauth

@guest('admin')
    // The user is not authenticated...
@endguest

Section Directives

با استفاده از دستور @hasSection شما می توانید بررسی کنید که یک section دارای content است یا خیر:

@hasSection('navigation')
    ‌‌<‌‌‌‌div class="pull-right"‌‌>‌
        @yield('navigation')
    ‌‌<‌‌/div‌‌>‌‌

    ‌<‌‌div class="clearfix"‌‌>‌‌‌<‌‌/div‌‌>‌
@endif

Switch Statements

دستورات Switch را می توان با استفاده از دستور های @switch@case@break@default و@endswitch ایجاد کرد:

@switch($i)
    @case(1)
        First case...
        @break

    @case(2)
        Second case...
        @break

    @default
        Default case...
@endswitch

Loops

علاوه بر عبارات شرطی ، Blade دستورالعمل های ساده ای برای کار با ساختارهای حلقه PHP ارائه می دهد.

@for ($i = 0; $i ‌<‌ 10; $i++)
    The current value is {{ $i }}
@endfor

@foreach ($users as $user)
    ‌<‌‌‌p‌>‌This is user {{ $user-‌>‌id }}‌<‌‌/p‌‌>‌
@endforeach

@forelse ($users as $user)
    ‌<‌‌li‌‌>‌{{ $user-‌>‌name }}‌<‌‌/li‌‌>‌
@empty
    ‌<‌‌‌p‌>‌No users‌<‌‌/p‌‌>‌
@endforelse

@while (true)
    ‌<‌‌‌p‌>‌I'm looping forever.‌<‌‌/p‌‌>‌
@endwhile

هنگام حلقه ، می توانید از متغیر loop استفاده کنید تا اطلاعات ارزشمندی در مورد loop بدست آورید ، مانند اینکه آیا در اولین یا آخرین حلقه تکرار هستید.

هنگام استفاده از حلقه ها ، ممکن است حلقه را پایان دهید یا تکرار جاری را skipکنید:

@foreach ($users as $user)
    @if ($user-‌>‌type == 1)
        @continue
    @endif

    ‌<‌‌li‌‌>‌{{ $user-‌>‌name }}‌<‌‌/li‌‌>‌

    @if ($user-‌>‌number == 5)
        @break
    @endif
@endforeach

شما همچنین می توانید شرط را با اعلان دستور در یک خط وارد کنید:

@foreach ($users as $user)
    @continue($user-‌>‌type == 1)

    ‌<‌‌li‌‌>‌{{ $user-‌>‌name }}‌<‌‌/li‌‌>‌

    @break($user-‌>‌number == 5)
@endforeach

Loop Variable

هنگام حلقه ، یک متغیر $loop در داخل حلقه در دسترس خواهد بود. این متغیر دسترسی به چند بیت مفید از اطلاعات مانند index حلقه جاری و اینکه آیا این اولین یا آخرین تکرار از طریق حلقه است را فراهم می کند:

@foreach ($users as $user)
    @if ($loop-‌>‌first)
        This is the first iteration.
    @endif

    @if ($loop-‌>‌last)
        This is the last iteration.
    @endif

    ‌<‌‌‌p‌>‌This is user {{ $user-‌>‌id }}‌<‌‌/p‌‌>‌
@endforeach

اگر در یک حلقه تو در تو قرار دارید ، می توانید از طریق parent property به متغیر$loop حلقه والد دسترسی پیدا کنید:

@foreach ($users as $user)
    @foreach ($user-‌>‌posts as $post)
        @if ($loop-‌>‌parent-‌>‌first)
            This is first iteration of the parent loop.
        @endif
    @endforeach
@endforeach

متغیر $loop همچنین شامل انواع دیگری از property های مفید است:

Comments

Blade همچنین به شما امکان تعریف comment  در view ها را می دهد. با این حال ، بر خلاف HTML comment، کامنت های Blade در HTML بازگشتی توسط برنامه شما وجود ندارد:

{{-- This comment will not be present in the rendered HTML --}}

PHP

در برخی شرایط ، قرار دادن کد PHP در view های شما مفید است. می توانید از دستور Blade @php برای اجرای یک بلاک PHP در tempalte خود استفاده کنید:

@php
    //
@endphp

در حالی که Blade این feature را ارائه می دهد ، استفاده مكرر از آن ممكن است نشانه این باشد كه شما logic زیادی را در template خود embed كرده اید.

ادامه دارد...