Blade Templating

موتور قالب‌سازی Blade در Laravel

graph TD A[Blade Template] --> B[Blade Compiler] B --> C[PHP Code] C --> D[Cache] D --> E[Execute] F[Directives] --> B G[Components] --> B H[Inheritance] --> B

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