مشخصات مقاله
-
2003
-
0.0
-
11152
-
0
-
0
آموزش قالب های Blade در لاراول
قالب های Blade
فهرست محتوا
- مقدمه
-
ارث بری قالب (Template Inheritance)
- تعریف یک layout
- ارث بری از یک layout
- نمایش و چاپ داده ها
- ساختارهای کنترلی
- Service injection
- توسعه ی Blade (ایجاد دستورهای اختصاصی)
مقدمه
Blade یک موتور ساده و در عین حال بسیار کارآمد ساخت قالب است که به همراه چارچوب نرم افزاری لاراول در اختیار برنامه نویس قرار می گیرد. بر خلاف دیگر موتورهای قالب ساز پرطرفردار PHP، Blade شما را در استفاده از کد ساده و خالص PHP در View ها آزاد می گذارد. تمامی view های مبتنی بر Blade به کد ساده ی PHP کامپایل شده و سپس به طور موقت در حافظه ی نهان ذخیره می شوند حداقل تا زمانی اینکه توسط شما ویرایش شوند. از آنچه گفته شد نتیجه می گیریم که Blade تقریبا هیچ overhead و سرباری به اپلیکیشن شما اضافه نمی کند. فایل های view مبتنی برBlade همگی از پسوند.blade.php استفاده می کنند و در پوشه ی resources/views ذخیره می شوند.
ارث بری قالب ها (Template Inheritance)
تعریف یک layout
دو مزییت برجسته ی استفاده از Blade ارث بری قالب ها و بخش ها است (template and section inheritance). برای تشریح بهتر این مفهوم کار را با یک مثال ساده آغاز می کنیم.
برای این منظور ابتدا طرح کلی یک صفحه ی اصلی (master page layout) را مورد بررسی قرار می دهیم. از آنجایی که بیشتر برنامه های تحت برای تقریبا تمامی صفحات خود از یک layout کلی استفاده می کنند، بهتر است طرح کلی خود را در قالب یک view واحد مبتنی بر Blade تعریف کنیم:
<!-- Stored in resources/views/layouts/master.blade.php -->
<html>
<head>
<title>App Name - @yield('title')</title>
</head>
<body>
@section('sidebar')
This is the master sidebar.
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
همان طور که می بینید، این فایل دربردارنده ی تگ های متعارف HTML می باشد. اما از شما می خواهیم که توجه خود را به دو دستور @sectionو@yield جلب کنید. دستور اول، همان طور که از نام آن پیدا است، بخشی از محتوا را تعریف می کند و دستور دوم برای نمایش محتوای بخش مورد نظر را بکار می رود.
پس از تعریف layout و طرح کلی برنامه، یک صفحه ی فرزند می سازیم که از layout مزبور ارث بری می کند.
ارث بری از یک layout
به هنگام تعریف یک صفحه ی فرزند، می توانید از دستور @extends استفاده کنید. این دستور مشخص می کند صفحه ی جاری باید از کدام layoutارث بری کند. View هایی که از یک layout مبتنی بر Blade ارث بری می کنند می توانند با استفاده از دستور @section محتویاتی را در بخش هایی از layout تزریق کنند. همان طور که در مثال فوق مشاهده شد، محتویات این بخش ها از طریق دستور @yield در layout نمایش داده می شوند:
<!-- Stored in resources/views/child.blade.php -->
@extends('layouts.master')
@section('title', 'Page Title')
@section('sidebar')
@parent
<p>This is appended to the master sidebar.</p>
@endsection
@section('content')
<p>This is my body content.</p>
@endsection
در مثال حاضر آن بخش از کد که مربوط به sidebar است، از دستور@parent برای پیوست محتوا به نوارکناری طرح کلی (layout) استفاده می کند(توجه داشته باشید که بجای بازنویسی محتوای موجود، محتوای جدیدی را به طرح کلی ضمیمه می کند). دستور ذکر شده در زمان اجرا و به نمایش در آمدن view با محتوای طرح کلی (layout) جایگزین می شود.
البته درست مانند view های متعارف زبان PHP، view های مبتنی بر Blade را نیز می توان به وسیله ی تابع کمکی سراسری view از یک routeمعین بازگرداند:
Route::get('blade', function () {
return view('child');
});
نمایش و چاپ داده ها
برای نمایش و چاپ داده های ارسالی به view های مبتنی بر Blade، کافی است آن ها را در {} محصور نمایید. به عنوان مثال فرض بگیرید چنینroute ای را در اختیار داریم:
Route::get('greeting', function () {
return view('welcome', ['name' => 'Samantha']);
});
می توانید محتوای متغیر name را به صورت زیر در view به نمایش بگذارید:
Hello, {{ $name }}.
مسلما نمایش محتویات متغیرهای ارسالی در view تنها کاری نیست که شما می توانید انجام دهید. بلکه می توانید نتایج یک تابع PHP را (با بهره گیری از دستور echo) در صفحه نمایش دهید. در واقع شما آزادید هر کدی را داخل دستور echo قرار داده و در صفحه چاپ نمایید:
The current UNIX timestamp is {{ time() }}.
دستورات {{ }} به صورت خودکار از طریق تابع درون ساخته ی پی اچ پی htmlentities ارسال می شوند تا بدین وسیله از رخداد حملات XSSجلوگیری شود.
Blade و کتابخانه های جاوا اسکریپت
همان طور که می دانید کتابخانه های جاوا اسکریپت نیز از {{}} برای نمایش و چاپ داده ها در مرورگر استفاده می کنند. بنابراین به منظور جلوگیری از ایجاد تداخل، از علامت @ استفاده کرده و به موتور اجرا و نمایش Blade اعلان می کنیم عبارت محصور در {{}} را تفسیر نکند. مثال:
<h1>Laravel</h1>
Hello, @{{ name }}.
در این مثال علامت @ به خودی خود توسط Blade حذف می شود. با این حال موتور Blade عبارت {{ name }} را کاملا دست نخورده رها کرده، تفسیر و اجرای آن را مسقیما به کتابخانه ی جاوا اسکریپت واگذار می کند.
نمایش داده در صورت موجود بودن آن
گاهی لازم است یک متغیر را در مرورگر به نمایش بگذارید، اما مطمئن نیستید که این متغیر مقداردهی شده است یا خیر. این کار را می توان به وسیله ی کد طولانی PHP به صورت زیر انجام داد:
{{ isset($name) ? $name : 'Default' }}
بجای نوشتن یک دستور سه گانه ی PHP، می توانید از یک روش میان بر (که Blade امکان آن را فراهم آورده) برای بدست آوردن نتیجه ی مطلوب استفاده نمایید:
{{ $name or 'Default' }}
در این مثال، در صورت وجود متغیری به نام $name، مقدارش به نمایش در می آید. حال اگر متغیری با این نام یافت نشد، کلمه ی Default جایگزین آن خواهد شد.
نمایش داده های unescaped (بدون جایگزینی)
به صورت پیش فرض، آن دسته از دستورات Blade که داخل {{}} محصور می شوند، از طریق تابع htmlentities پی اچ پی ارسال شده تا بدین وسیله از حملات XSS جلوگیری شود. برای اینکه داده ها را به صورت unescaped (بدون جایگزینی) نمایش دهید، می توانید از دستور زیر استفاده کنید:
Hello, {!! $name !!}.
لازم است به هنگام نمایش محتوای ارائه شده توسط کاربران اپلیکیشن، دقت کافی را داشته باشید. توصیه ی ما بر این است که همیشه از {{}} برای نمایش entity های HTML موجود در محتوای ارائه شده استفاده کنید.
ساختارهای کنترلی
علاوه بر قابلیت ارث بری از قالب ها و نمایش یا چاپ داده ها، Blade دستورات میانبری هم برای ساختارهای کنترلی متعارف PHP فراهم می کند که از جمله ی آن می توان به دستورات شرطی و حلقه ها اشاره کرد. این دستورات میان بر روشی آسان و کوتاه برای کار با ساختارهای کنترلی PHP فراهم آورده و در عین حال به معادل های PHP خود بسیار شبیه باقی می مانند.
دستورات شرطی if
برای تنظیم و نگارش عبارات if می توانید از دستوراتی نظیر @if ، @elseif ، @else و @endif استفاده کنید. این دستورات عملکردی کاملا مشابه همتاهای PHP خود دارند:
@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
حلقه های تکرار
علاوه بر عبارات شرطی، Blade دستوراتی هم برای کار با ساختار های تکرار و حلقه های PHP فراهم می آورد. همان طور که در مورد عبارت شرطی گفته شد، حلقه های تکرار 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
اضافه کردن sub-view ها (نمایش یک view در view دیگر)
دستور@include به شما این امکان را می دهد تا به راحتی یک view مبتنی بر Blade را داخل view دیگری گنجانده و نمایش دهید. تمامی متغیرهای موجود در view پدر، در اختیار view زیرمجموعه یا فرزند (view گنجانده شده در view والد) قرار می گیرد:
<div>
@include('shared.errors')
<form>
<!-- Form Contents -->
</form>
</div>
اگرچه view فرزند به خودی خود تمامی داده ها و ویژگی های view والد را به ارث می برد، با این وجود می توان داده ها و اطلاعات بیشتری را نیز در قالب آرایه به این view ارسال کرد:
@include('view.name', ['some' => 'data'])
بایستی از بکار بردن ثوابت __DIR__ و __FILE__ در view های Blade خودداری نمایید. اگر از این دو ثابت استفاده کنید، در واقع عملا به مکان قرار گیری view کش شده ارجاع می دهید.
Rendering Views For Collections
می توانید با استفاده از دستور@each حلقه ها و include ها را ترکیب کرده و در یک خط بگنجانید:
@each('view.name', $jobs, 'job')
اولین آرگومان ارسالی به این تابع، view partial ای است که به ازای هر المان در آرایه یا مجموعه (collection) نمایش داده می شود. دومین پارامتر ارسالی یک آرایه یا مجموعه است که در آن حلقه می زنیم. سومین آرگومان اسم متغیر است که به گام شمارش جاری داخل view اختصاص داده می شود. بنابراین اگر داخل آرایه ای از job ها حلقه بزنید، متعاقبا می خواهید که به هر job به صورت یک متغیر job داخل view partial دسترسی داشته باشید.
همچنین می توانید یک آرگومان چهارم به دستور @each ارسال کنید. این آرگومان مشخص می کند در صورتی که آرایه ی ارسالی تهی بود، کدامview نمایش داده شود:
@each('view.name', $jobs, 'job', 'view.empty')
Comment ها (توضیحات کد)
Blade به شما این امکان را می دهد تا در view خود comment قرار دهید. اما برخلاف comment های HTML، Comment های Blade داخل خروجی HTML (HTML ای که توسط برنامه برگردانده می شود) لحاظ نمی شوند:
Service injection
Blade به شما اجازه می دهد دستورات سفارشی خود را تعریف نمایید. می توانید از دستور directive برای ثبت و ایجاد یک دستور (directive) جدید استفاده کنید. زمانی که کامپایلر Blade با یک directive جدید برخورد می کند، بلافاصله تابع callback ارائه شده را به همراه پارامترهای ورودی آن فراخوانی می کند.
مثال زیر یک دستور ساده ی @datetime($var) ایجاد می کند که وظیفه ی آن فرمت دهی یک متغیر $var است:
<?php
namespace App\Providers;
use Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Blade::directive('datetime', function($expression) {
return "<?php echo with{$expression}->format('m/d/Y H:i'); ?>";
});
}
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
//
}
}
همان طور که مشاهده می کنید تابع کمکی with از توابع کمکی لاراول در این دستور بکار گرفته شده است. تنها کاری که تابع کمکی with می کند بازگردانی شی / مقداری است که به عنوان پارامتر به آن پاس داده شده که شرایط لازم برای متصل کردن زنجیره ای متدها به یکدیگر را فراهم آورده است. کد نهایی PHP که خروجی این دستور می باشد در زیر نمایش داده شده است:
<?php echo with($var)->format('m/d/Y H:i'); ?>