定义片段
@section('content')
xxxx
@show
show 表示同时显示
@section('ccc')
xxxx
@endsection
使用 endsection 不会主动显示,只有 yield 指定的地方 和 @section ...@show 的地方会显示
显示指定片段的内容
@yield('content')
扩展布局 (继承)
// 指定子页面所继承的布局
@extend('layouts.app')
此时 这个 子页面(视图)将会使用 @section 指令注入内容到布局的片段中
子页面和父页面都有定义 @setion('content') 片段,则子页面会覆盖父页面
如果想使用追加可以使用 @parent
@section('content')
@parent
new - xxxx
@show
@parent指令在渲染的时将被替换为布局中的内容
注:
使用 section ... show 然后又使用了 section ... endsection (无论是在布局还是子视图中)那么show 里面的会被 endsection 定义的 覆盖
想要追加 那么要在 endsection 区添加 @parent
如果是
section ... show
section ... endsection
section ... show
那么两处show 都会被 endsection 里的内容替代。 但是要注意此时 第二个 section...show 会跑到页面的最上面,可以通过查看网页源代码发现。
输出 php 代码有以下方式:
1.{{ $var }}
2.{!! $var !!}
3.<?php echo $var; ?>
第三种就不用说了,第一种和第二种其实都是相当于 echo 但是第一种是 echo e($var) 调用了辅助函数e() --> 定义:
function e($value)
{
if ($value instanceof Htmlable) {
return $value->toHtml();
}
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false);
}
即有经过 html实体字符转换
第二种就是 echo $var 了 具体这些都可以参考 storage/framework/views/下编译出来的文件查看 原生内容 。
如果想让 {{}} 不被 slade 引擎转义 那么可以使用 @符号 @{{$var}} 这样就会原样输出
如果很大一块代码需要原样输出: verbatim 指令
@verbatim
<div class="container">
Hello, {{ name }}.
</div>
@endverbatim
组件和插槽:
组件和插槽可以是 section 和 layout应用更灵活,且 也很容易理解。页面需要复用的东西可以通过 组件和插槽实现,例如:
我们在 controller 里定义要渲染的视图是 test 即 return view('test')
然后在 test.blade.php 里首先 extends('layouts.app') 然后需要引入提示消息的视图,明显这个可以在各个页面复用,那么可以使用 组件和插槽的方式:
test.blade.php:
@extends('layouts.app')
@section('content')
<h1>test blade2</h1>
@parent
<hr/>
@component('alert',['foo' => 'bar','tt'=>'TTTTHHH'])
aaaa
@slot('title')
Forbidden
@endslot
@slot('foo')
barbarbar
@endslot
@slot('aex','哈哈哈哈')
You are not allowed to access this resource!
@endcomponent
@endsection
alert.blade.php:
<div class="alert alert-danger">
<div class="alert-title">{{ $title }}</div>
{{ $slot }}
<h1>{{$foo}}</h1>
<h1>{!! $foo !!}</h1>
<h2>{{$tt}}</h2>
<h3>{{$aex}}</h3>
</div>
那么由此 上面的 section 会被放到 layouts.app 里 yield 定义的content 这些都是之前的概念了。
componet 定义了 alert 于是就会去渲染 alert.blade.php 后面的数组可以不定义,定义了就是往alert视图注入变量 即:$foo = 'bar', $tt = 'TTTTHHH' 这样就可以做到把 controller里的变量传递给 alert视图了
后面的 @slot 指令其实也是相当于 $title = 'Forbidden'
还可以写为 @slot('aex','哈哈哈哈') 即 $aex = '哈哈哈哈';
最后你会发现还有不再 @slot指令里的内容 即 aaaa 和 You are not allowed to access this resource! 他们会被放到 alert 模版 $slot 指定的地方。
感兴趣的仍然可以去看下 framework 编译的原始文件 ,大致会看到 $__env->startComponent('alert',['foo' => 'bar','tt'=>'TTTTHHH']) ... 这样的内容,
然后看下 startComponent 的定义以及其它的函数定义 就大致理解工作流程了(主要使用了 ob_start 和 ob_get_clean 等)。 定义文件在:\vendor\laravel\framework\src\Illuminate\View\Concerns\ManagesComponents.php
子视图:
Blade 的 @include 指令允许你很轻松地在一个视图中包含另一个 Blade 视图,所有父级视图中变量在被包含的子视图中依然有效:
<div>
@include('shared.errors')
<form>
<!-- Form Contents -->
</form>
</div>
尽管被包含的视图可以继承所有父视图中的数据,你还可以传递额外参数到被包含的视图:
@include('view.name', ['some' => 'data'])
堆栈:
前端页面 js我们通常希望放到页脚,不同页面引入的 js 又不一样,想要做到这点就可以使用堆栈功能。
例如在布局文件 app.blade.php 最下面 </body> 上面加入 @stack('scripts') 然后在你要渲染的视图 例如 test.blade.php 将js推送入栈即可
@push('scripts')
<script type="text/javascript" src="/jquery.min.js"></script>
@endpush
服务注入:
视图中大部分变量是通过 controller 传递的,但是有的时候我们仍需要调用 laravel 的一些类获取相应的值,那么可以使用 @inject 指令
@inject 指令可以用于从服务容器中获取服务,传递给 @inject 的第一个参数是服务将要被分配到的变量名,第二个参数是要解析的服务类名或接口名:
@inject('metrics', 'App\Services\MetricsService')
<div>
Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>
你也可以这样使用:
<?php
var_dump(App\User::where('id',1)->first()->toArray());
?>
欢迎转载,转载请注明来源:laravel blade 模版引擎指令详解和使用举例