laravel-blade

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Laravel Blade

Laravel Blade

Agent Workflow (MANDATORY)

Agent工作流程(强制要求)

Before ANY implementation, use
TeamCreate
to spawn 3 agents:
  1. fuse-ai-pilot:explore-codebase - Check existing views, components structure
  2. fuse-ai-pilot:research-expert - Verify latest Blade docs via Context7
  3. mcp__context7__query-docs - Query specific patterns (components, slots)
After implementation, run fuse-ai-pilot:sniper for validation.

在进行任何实现之前,使用
TeamCreate
生成3个Agent:
  1. fuse-ai-pilot:explore-codebase - 检查现有视图、组件结构
  2. fuse-ai-pilot:research-expert - 通过Context7验证最新Blade文档
  3. mcp__context7__query-docs - 查询特定模式(组件、插槽)
实现完成后,运行fuse-ai-pilot:sniper进行验证。

Overview

概述

Blade is Laravel's templating engine. It provides a clean syntax for PHP in views while compiling to pure PHP for performance.
Component TypeWhen to Use
AnonymousSimple UI, no logic needed
Class-basedDependency injection, complex logic
LayoutPage structure, reusable shells
DynamicRuntime component selection

Blade是Laravel的模板引擎。它为视图中的PHP代码提供了简洁的语法,同时会编译为纯PHP代码以保证性能。
组件类型适用场景
Anonymous简单UI,无需逻辑
Class-based依赖注入、复杂逻辑
Layout页面结构、可复用外壳
Dynamic运行时组件选择

Critical Rules

核心规则

  1. Always escape output - Use
    {{ }}
    not
    {!! !!}
    unless absolutely necessary
  2. Use @props - Declare expected props explicitly
  3. Merge attributes - Allow class/attribute overrides with
    $attributes->merge()
  4. Prefer anonymous - Use class components only when logic is needed
  5. Use named slots - For complex layouts with multiple content areas
  6. CSRF in forms - Always include
    @csrf
    in forms

  1. 始终转义输出 - 使用
    {{ }}
    而非
    {!! !!}
    ,除非绝对必要
  2. 使用@props - 显式声明预期的props
  3. 合并属性 - 使用
    $attributes->merge()
    允许类/属性覆盖
  4. 优先选择匿名组件 - 仅在需要逻辑时使用类组件
  5. 使用命名插槽 - 适用于包含多个内容区域的复杂布局
  6. 表单中添加CSRF - 表单中始终包含
    @csrf

Decision Guide

决策指南

Component Type Selection

组件类型选择

Need dependency injection?
├── YES → Class-based component
└── NO → Anonymous component
    Need complex props logic?
    ├── YES → Class-based component
    └── NO → Anonymous component
需要依赖注入?
├── 是 → 类组件
└── 否 → 匿名组件
    需要复杂的props逻辑?
    ├── 是 → 类组件
    └── 否 → 匿名组件

Layout Strategy

布局策略

Simple page structure?
├── YES → Component layout (<x-layout>)
└── NO → Need fine-grained sections?
    ├── YES → @extends/@section
    └── NO → Component layout

页面结构简单?
├── 是 → 组件布局(<x-layout>)
└── 否 → 需要细粒度的区块?
    ├── 是 → @extends/@section
    └── 否 → 组件布局

Key Concepts

核心概念

ConceptDescriptionReference
@propsDeclare component propertiescomponents.md
$attributesPass-through HTML attributesslots-attributes.md
x-slotNamed content areasslots-attributes.md
@yield/@sectionTraditional layout inheritancelayouts.md
$loopLoop iteration infodirectives.md

概念说明参考文档
@props声明组件属性components.md
$attributes透传HTML属性slots-attributes.md
x-slot命名内容区域slots-attributes.md
@yield/@section传统布局继承layouts.md
$loop循环迭代信息directives.md

Reference Guide

参考指南

Concepts (WHY & Architecture)

概念(设计思路与架构)

TopicReferenceWhen to Consult
Componentscomponents.mdClass vs anonymous, namespacing
Slots & Attributesslots-attributes.mdData flow, $attributes bag
Layoutslayouts.mdPage structure, inheritance
Directivesdirectives.md@if, @foreach, @auth, @can
Securitysecurity.mdXSS, CSRF, escaping
Vitevite.mdAsset bundling
Advanced Directivesadvanced-directives.md@once, @use, @inject, @switch, stacks
Custom Directivescustom-directives.mdBlade::if, Blade::directive
Advanced Componentsadvanced-components.md@aware, shouldRender, index
Forms & Validationforms-validation.md@error, form helpers
Fragmentsfragments.md@fragment, HTMX integration
主题参考文档适用场景
Componentscomponents.md类组件vs匿名组件、命名空间
Slots & Attributesslots-attributes.md数据流、$attributes集合
Layoutslayouts.md页面结构、继承
Directivesdirectives.md@if、@foreach、@auth、@can
Securitysecurity.mdXSS、CSRF、转义
Vitevite.md资源打包
Advanced Directivesadvanced-directives.md@once、@use、@inject、@switch、stacks
Custom Directivescustom-directives.mdBlade::if、Blade::directive
Advanced Componentsadvanced-components.md@aware、shouldRender、index
Forms & Validationforms-validation.md@error、表单助手
Fragmentsfragments.md@fragment、HTMX集成

Templates (Complete Code)

模板(完整代码)

TemplateWhen to Use
ClassComponent.php.mdComponent with logic/DI
AnonymousComponent.blade.mdSimple reusable UI
LayoutComponent.blade.mdPage layout structure
FormComponent.blade.mdForm with validation
CardWithSlots.blade.mdNamed slots pattern
DynamicComponent.blade.mdRuntime component
AdvancedDirectives.blade.md@once, @use, @inject, @switch
CustomDirectives.php.mdCreate custom directives
AdvancedComponents.blade.md@aware, shouldRender, index
Fragments.blade.mdHTMX partial updates

模板适用场景
ClassComponent.php.md带逻辑/依赖注入的组件
AnonymousComponent.blade.md简单可复用UI
LayoutComponent.blade.md页面布局结构
FormComponent.blade.md带验证的表单
CardWithSlots.blade.md命名插槽模式
DynamicComponent.blade.md运行时组件
AdvancedDirectives.blade.md@once、@use、@inject、@switch
CustomDirectives.php.md创建自定义指令
AdvancedComponents.blade.md@aware、shouldRender、index
Fragments.blade.mdHTMX局部更新

Quick Reference

快速参考

Anonymous Component

匿名组件

blade
{{-- resources/views/components/alert.blade.php --}}
@props(['type' => 'info', 'message'])

<div {{ $attributes->merge(['class' => 'alert alert-'.$type]) }}>
    {{ $message }}
</div>
blade
{{-- resources/views/components/alert.blade.php --}}
@props(['type' => 'info', 'message'])

<div {{ $attributes->merge(['class' => 'alert alert-'.$type]) }}>
    {{ $message }}
</div>

Class Component

类组件

php
// app/View/Components/Alert.php
class Alert extends Component
{
    public function __construct(
        public string $type = 'info',
        public string $message = ''
    ) {}

    public function render(): View
    {
        return view('components.alert');
    }
}
php
// app/View/Components/Alert.php
class Alert extends Component
{
    public function __construct(
        public string $type = 'info',
        public string $message = ''
    ) {}

    public function render(): View
    {
        return view('components.alert');
    }
}

Named Slots

命名插槽

blade
<x-card>
    <x-slot:header class="font-bold">
        Title
    </x-slot>

    Content goes here

    <x-slot:footer>
        Footer content
    </x-slot>
</x-card>
blade
<x-card>
    <x-slot:header class="font-bold">
        Title
    </x-slot>

    Content goes here

    <x-slot:footer>
        Footer content
    </x-slot>
</x-card>

Attribute Merging

属性合并

blade
@props(['disabled' => false])

<button {{ $attributes->merge([
    'type' => 'submit',
    'class' => 'btn btn-primary'
])->class(['opacity-50' => $disabled]) }}
    @disabled($disabled)
>
    {{ $slot }}
</button>

blade
@props(['disabled' => false])

<button {{ $attributes->merge([
    'type' => 'submit',
    'class' => 'btn btn-primary'
])->class(['opacity-50' => $disabled]) }}
    @disabled($disabled)
>
    {{ $slot }}
</button>

Best Practices

最佳实践

DO

建议做法

  • Use
    @props
    to document expected props
  • Use
    $attributes->merge()
    for flexibility
  • Prefer anonymous components for simple UI
  • Use named slots for complex layouts
  • Keep components focused and reusable
  • 使用
    @props
    记录预期的props
  • 使用
    $attributes->merge()
    提升灵活性
  • 优先为简单UI使用匿名组件
  • 为复杂布局使用命名插槽
  • 保持组件聚焦且可复用

DON'T

避免做法

  • Use
    {!! !!}
    without sanitization
  • Forget
    @csrf
    in forms
  • Put business logic in Blade templates
  • Create deeply nested component hierarchies
  • Hardcode classes (allow overrides)
  • 未经过滤就使用
    {!! !!}
  • 表单中遗漏
    @csrf
  • 在Blade模板中写入业务逻辑
  • 创建深度嵌套的组件层级
  • 硬编码类名(允许覆盖)