前言:Laravel文档梳理,仅作为记录后看,无关其他。
1、blade是什么?
Blade是Laravel提供的模板引擎
2、blade的视图文件是什么样的?
后缀为.blade.php的文件,存放于resources/views目录
3、blade模板的优点是?
模板继承 与 区块
4、blade模板示例:
<!-- 文件保存于 resources/views/layouts/master.blade.php -->
<html>
<head>
<title>应用程序名称 - @yield('title')</title>
</head>
<body>
@section('sidebar')
这是主要的侧边栏。
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
@section定义一个内容区块,@yield被用来显示指定区块的内容。
5、页面的继承布局
实例,接4
<!-- 保存于 resources/views/child.blade.php -->
@extends('layouts.master')
@section('title', '页面标题')
@section('sidebar')
@parent
<p>这边会附加在主要的侧边栏。</p>
@endsection
@section('content')
<p>这是我的主要内容。</p>
@endsection
解释:
1、@extend命令指定子页面继承哪个布局,这里,继承的master.blade.php的布局
2、master布局中,定义了 <title>应用程序名称 - @yield('title')</title>,所以,子页面可以通过@section定义一个区块的内容,其他的一样。
3、@parent命令,这里需要注意一下,它是增加,而不是覆盖内容。@parent命令会在视图输出时,被置换成布局的内容。
6、blade页面赋值
Route::get('greeting', function () {
return view('welcome', ['name' => 'Samantha']);
});
页面显示:
Hello, {{ $name }}.
Ps:任何你想要的代码都可以放到blade模板里
如 UNIX 时间戳为 {{ time() }}。
注意:blade模板的{{ }}语法会自动调用PHP的htmlentites函数来防御XSS攻击
7、blade与js语法的冲突
很多的js也有使用大括号来显示指定表达式的习惯,为了规避冲突,blade模板引擎使用@符号来区分。
<h1>Laravel</h1>
Hello, @{{ name }}.
8、blade模板的三目运算
{{ isset($name) ? $name : 'Default' }}
也可以这样替代:
{{ $name or 'Default' }}
9、有些变量,赋值到blade模板,会被htmlentites()函数转义,但是,你不想被转义,怎么办?
如下实例:
Hello, {!! $name !!}.
警告:对于用户提供的数据,请总是使用{{ }}语法来解析,以防止XSS攻击
10、if表达式
@if (count($records) === 1)
我有一条记录!
@elseif (count($records) > 1)
我有多条记录!
@else
我没有任何记录!
@endif
11、@unless 除非
@unless (Auth::check())
你尚未登录。
@endunless
括号为false显示“你尚未登录”
12、循环
@for ($i = 0; $i < 10; $i++)
目前的值为 {{ $i }}
@endfor
@foreach ($users as $user)
<p>此用户为 {{ $user->id }}</p>
@endforeach
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>没有用户</p>
@endforelse
@while (true)
<p>我永远都在跑循环。</p>
@endwhile
13、@include 引入子视图
<div>
@include('shared.errors')
<form>
<!-- 表单内容 -->
</form>
</div>
Ps:子视图会继承父视图的所有数据,但如果,你还想给子视图传递额外数据,多加一个数组参数,即可。如下操作:
@include('view.name', ['some' => 'data'])
注意:避免在视图中使用__DIR__及__FILE__常数
14、@each命令
@each('view.name', $jobs, 'job')
Ps:参数一、局部视图名称;参数二、要传递的变量;参数三、视图中接收变量值的名称
换句话说,这条命令的意思是,给view.name视图传递变量$jobs的值到页面的job。
15、注释
{{-- 此注释将不会出现在渲染后的 HTML --}}
Ps:注释如上操作就行了。
16、@inject 服务注入
@inject('metrics', 'App\Services\MetricsService')
<div>
每月收入:{{ $metrics->monthlyRevenue() }}。
</div>
Ps:@inject命令可以取出laravel服务器中的容器到页面。
参数一:服务的名;参数二:服务的类或接口的全名。
17、自定义blade命令
Blade允许自定义命令,使用directive()方法注册,实例如下:
<?php
namespace App\Providers;
use Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 运行服务注册后的启动进程。
*
* @return void
*/
public function boot()
{
Blade::directive('datetime', function($expression) {
return "<?php echo with{$expression}->format('m/d/Y H:i'); ?>";
});
}
/**
* 在容器注册绑定。
*
* @return void
*/
public function register()
{
//
}
}
在blade页面,调用这个自定义的命令,比如页面传$val参数,调用如下:
@datetime($var)
Ps:注意自定方法中的with()方法,它会简单地返回指定对象的值,并且允许链式操作。