Blade Templating
موتور قالبسازی Blade در Laravel
Blade موتور قالبسازی Laravel است که syntax ساده و قدرتمندی برای ایجاد viewها فراهم میکند. Blade فایلهای .blade.php را compile میکند و به PHP خالص تبدیل میکند که cached میشود برای performance بهتر.
ویژگیهای اصلی Blade:
- <strong>Syntax ساده و خوانا</strong>: استفاده از <code>{{ }}</code> برای echo و <code>@</code> برای directives
- <strong>Template Inheritance</strong>: استفاده از <code>@extends</code> و <code>@section</code> برای layouts
- <strong>Components</strong>: کامپوننتهای قابل استفاده مجدد
- <strong>Directives</strong>: دستورات کنترل flow مثل <code>@if</code>, <code>@foreach</code>
- <strong>Escaping خودکار</strong>: محافظت خودکار در برابر XSS attacks
- <strong>Raw Output</strong>: استفاده از <code>{!! !!}</code> برای output بدون escaping
- <strong>Comments</strong>: استفاده از <code>{{-- --}}</code> برای comments
- <strong>Includes</strong>: استفاده از <code>@include</code> برای include کردن partials
- <strong>Stacks</strong>: استفاده از <code>@push</code> و <code>@stack</code> برای جمعآوری content
- <strong>Once Directive</strong>: استفاده از <code>@once</code> برای اجرای یکباره
Directiveهای رایج:
- <code>@if</code>, <code>@elseif</code>, <code>@else</code>, <code>@endif</code> - Conditional statements
- <code>@foreach</code>, <code>@endforeach</code> - Loops
- <code>@for</code>, <code>@endfor</code> - For loops
- <code>@while</code>, <code>@endwhile</code> - While loops
- <code>@include</code> - Include partials
- <code>@extends</code> - Extend layouts
- <code>@section</code>, <code>@yield</code> - Sections
- <code>@component</code> - Components
- <code>@slot</code> - Slots
- <code>@auth</code>, <code>@guest</code> - Authentication checks
- <code>@can</code>, <code>@cannot</code> - Authorization checks
مثالها
Template Inheritance
@extends('layouts.app')
@section('title', 'Users')
@section('content')
<h1>Users</h1>
@foreach($users as $user)
<p>{{ $user->name }}</p>
@endforeach
@endsection
استفاده از template inheritance برای استفاده مجدد از layout.
Conditional Rendering
@if($user->isAdmin())
<p>Admin User</p>
@elseif($user->isModerator())
<p>Moderator</p>
@else
<p>Regular User</p>
@endif
@unless($user->isBanned())
<p>User is active</p>
@endunless
استفاده از دستورات شرطی در Blade.
Loops
@foreach($users as $user)
<p>{{ $user->name }}</p>
@if($loop->first)
<p>First user</p>
@endif
@if($loop->last)
<p>Last user</p>
@endif
@endforeach
@for($i = 0; $i < 10; $i++)
<p>Item {{ $i }}</p>
@endfor
استفاده از loops در Blade با access به loop variables.
Includes و Partials
@include('partials.header')
@include('partials.footer', ['year' => date('Y')])
@includeIf('partials.custom', ['data' => $data])
@includeWhen($user->isAdmin(), 'partials.admin-panel')
استفاده از @include برای include کردن partials.
Stacks
<!-- In layout -->
<head>
@stack('scripts')
</head>
<!-- In view -->
@push('scripts')
<script src="/js/custom.js"></script>
@endpush
<!-- Prepend -->
@prepend('scripts')
<script src="/js/jquery.js"></script>
@endprepend
استفاده از stacks برای جمعآوری content از چند view.
Raw Output و Escaping
<!-- Automatic escaping (safe) -->
<p>{{ $user->name }}</p>
<!-- Raw output (dangerous - only if trusted) -->
<div>{!! $htmlContent !!}</div>
<!-- Conditional escaping -->
<p>{{ $user->bio ?? 'No bio' }}</p>
<!-- JSON encoding -->
<script>
var user = @json($user);
</script>
تفاوت بین escaped و raw output.
Custom Directives
<?php
// In AppServiceProvider boot()
use Illuminate\Support\Facades\Blade;
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('Y-m-d H:i:s'); ?>";
});
// Usage in Blade
@datetime($user->created_at)
// Or with parameters
Blade::directive('route', function ($expression) {
return "<?php echo route($expression); ?>";
});
ایجاد custom directives برای Blade.
Once Directive
@once
@push('scripts')
<script src="/js/analytics.js"></script>
@endpush
@endonce
<!-- This ensures the script is only added once, even if included multiple times -->
استفاده از @once برای اجرای یکباره.
موارد استفاده
- ایجاد viewهای HTML با syntax ساده
- Template inheritance برای layouts
- استفاده مجدد از components
- Conditional rendering بر اساس data
- Loops برای نمایش lists
- Includes برای partials و reusable sections
اشتباهات رایج
- استفاده از {!! !!} برای untrusted data که باعث XSS میشود
- Nested includes که باعث performance issue میشود
- استفاده از PHP خالص به جای Blade directives
- فراموش کردن @endsection که باعث syntax error میشود
- استفاده از heavy logic در Blade که باید در controller باشد
- عدم استفاده از caching که باعث slow rendering میشود
بهترین روشها
- همیشه از {{ }} برای output استفاده کنید (automatic escaping)
- از {!! !!} فقط برای trusted HTML استفاده کنید
- از template inheritance برای layouts استفاده کنید
- از components برای reusable UI elements استفاده کنید
- Logic را در controller نگه دارید، نه در Blade
- از @include برای partials استفاده کنید
- Blade templates را cache کنید
موارد خاص
- Nested loops با complex data structures
- Conditional includes با missing files
- Stacks با multiple pushes
- Custom directives با complex logic
- Blade در API responses
- Blade با very large datasets
نکات عملکرد
- Blade templates به PHP compile میشوند و cached میشوند
- اولین request کندتر است (compilation time)
- استفاده از @include میتواند overhead داشته باشد
- Nested includes میتوانند slow باشند
- Blade caching در production بهبود performance میدهد
- استفاده از eager loading برای relationships مهم است
نکات امنیتی
- همیشه از {{ }} برای automatic XSS protection استفاده کنید
- از {!! !!} فقط برای trusted HTML استفاده کنید
- مطمئن شوید که user input همیشه escaped میشود
- از @json برای safe JSON encoding استفاده کنید
- مطمئن شوید که sensitive data در viewها expose نمیشود
نکات مصاحبه
- تفاوت بین {{ }} و {!! !!} چیست؟
- Template inheritance چگونه کار میکند؟
- چگونه میتوان custom directive ایجاد کرد؟
- Stacks چیست و چه زمانی استفاده میشود؟
- چگونه Blade templates cached میشوند؟
- مزایای استفاده از Blade چیست؟
یادداشتهای نسخه
- Laravel 11.x: بهبود performance در Blade compilation
- Laravel 11.x: پشتیبانی بهتر از components
- Laravel 10.x: بهبود @once directive
- Laravel 9.x: بهبود Blade caching mechanism