@verbatim 是 Laravel Blade 模板引擎中的一个特殊指令,用于告诉 Blade 不要解析指定块内的任何 Blade 语法,直接原样输出。
为什么需要 @verbatim?
当你在 Blade 模板中需要输出包含大量 {{ }} 或 @ 符号的内容(如 JavaScript 框架模板)时,Blade 会尝试解析这些内容,可能导致错误。这时可以使用 @verbatim 指令。
基本语法
@verbatim
// 这里的内容不会被 Blade 解析
{{ this will be output as is }}
@if(this too)
@endverbatim使用示例
1. 保护 JavaScript 框架代码
<div>
<h1>Vue.js 示例</h1>
@verbatim
<div id="app">
<p>{{ message }}</p> <!-- 这里不会被 Blade 解析 -->
<button @click="reverseMessage">反转消息</button>
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('')
}
}
})
</script>
@endverbatim
</div>2. 输出包含 Blade 语法的示例代码
<div>
<h2>Blade 语法示例</h2>
@verbatim
<pre>
<!-- Blade 条件语句示例 -->
@if($user->isAdmin())
<p>管理员用户</p>
@else
<p>普通用户</p>
@endif
<!-- Blade 循环示例 -->
@foreach($users as $user)
<p>{{ $user->name }}</p>
@endforeach
</pre>
@endverbatim
</div>3. 保护 JSON-LD 结构化数据
<head>
@verbatim
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "{{ article.title }}",
"author": {
"@type": "Person",
"name": "{{ article.author.name }}"
},
"datePublished": "{{ article.published_at }}",
"description": "{{ article.excerpt }}"
}
</script>
@endverbatim
</head>替代方案
使用 @ 符号转义
对于少量的 Blade 语法,可以使用 @ 符号进行转义:
<!-- 转义单个 Blade 表达式 -->
@@if($condition) <!-- 输出为 @if($condition) -->
<!-- 转义双花括号 -->
@{{ $variable }} <!-- 输出为 {{ $variable }} -->对比示例
<!-- 方法1: 使用 @verbatim (适合大量内容) -->
@verbatim
<div>
{{ name }}
@if(condition)
<span>内容</span>
@endif
</div>
@endverbatim
<!-- 方法2: 使用转义 (适合少量内容) -->
<div>
@{{ name }}
@@if(condition)
<span>内容</span>
@@endif
</div>实际应用场景
1. 文档网站展示代码示例
<!-- documentation.blade.php -->
<div class="example">
<h3>Blade 循环示例</h3>
@verbatim
<div class="code-example">
<!-- 展示 Blade 代码 -->
<pre><code>
@foreach($products as $product)
<div class="product">
<h4>{{ $product->name }}</h4>
<p>价格: ${{ $product->price }}</p>
</div>
@endforeach
</code></pre>
</div>
@endverbatim
<div class="live-example">
<!-- 实际执行的 Blade 代码 -->
@foreach($products as $product)
<div class="product">
<h4>{{ $product->name }}</h4>
<p>价格: ${{ $product->price }}</p>
</div>
@endforeach
</div>
</div>2. Vue/React/Angular 组件
<!-- vue-component.blade.php -->
@verbatim
<div id="vue-app">
<todo-list>
<todo-item
v-for="item in groceryList"
v-bind:todo="item"
v-bind:key="item.id"
></todo-item>
</todo-list>
</div>
<script>
Vue.component('todo-item', {
props: ['todo'],
template: '<li>{{ todo.text }}</li>'
})
</script>
@endverbatim3. 包含 Mustache/Handlebars 模板
<!-- email-template.blade.php -->
@verbatim
<script id="email-template" type="text/x-handlebars-template">
<div class="email">
<h1>{{ subject }}</h1>
<p>亲爱的 {{ recipientName }},</p>
<p>{{ messageBody }}</p>
{{#if hasAttachment}}
<p>请查看附件。</p>
{{/if}}
</div>
</script>
@endverbatim注意事项
不能嵌套使用:
@verbatim指令不能嵌套性能考虑:大量使用
@verbatim可能会轻微影响性能与其他指令配合:在
@verbatim块内,所有 Blade 指令都不会被解析PHP 代码依然执行:
@verbatim只阻止 Blade 解析,PHP 代码依然会执行
@php
$message = "Hello World";
@endphp
@verbatim
<!-- 这里 $message 不会被 Blade 解析 -->
{{ $message }} <!-- 输出为: {{ $message }} -->
<!-- 但 PHP 变量仍然可以访问(通过纯 PHP) -->
<?php echo $message; ?> <!-- 输出为: Hello World -->
@endverbatim总结
@verbatim 指令是处理 Blade 模板中需要原样输出的内容的理想工具,特别适用于:
前端 JavaScript 框架模板
展示 Blade/PHP 代码示例
包含大量特殊符号的脚本或样式
JSON-LD 或其他结构化数据格式
对于简单的需求,使用 @ 符号转义可能更合适;但对于大段的、包含多种 Blade 语法的内容,@verbatim 指令是更清晰、更便捷的选择。