模板引擎

一、中间件

Laravel 的 HTTP
中间件提供了对路由的风流倜傥层过滤和尊崇。下边模拟一下用中间件验证后台登陆。

 

1. 开立中间件

cmd 窗口走入项目目录,使用 artisan 命令创设

php artisan make:middleware AdminLoginVerify

那就要 app/Http/Middleware 目录成立中间件 AdminLoginVerify

 

在 AdminLoginVerify 类的 handle(卡塔尔(قطر‎方法中加多验证逻辑:

<?php
namespace App\Http\Middleware;

use Closure;

class AdminLoginVerify
{
    public function handle($request, Closure $next)
    {
        if(!session('admin')){ // 如果没有登录则定向到登录页
            return redirect('admin/login');
        }
        return $next($request);
    }
}

ok,今后就创建并定义好了评释登陆的中间件 AdminLoginVerify

 

2. 登记中间件

在 app/Http/Kernel.php 文件里找到 protected $routeMiddleware
属性,追加大家的 AdminLoginVerify

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
         // 自定义中间件
        'adminLoginVerify' => \App\Http\Middleware\AdminLoginVerify::class,
    ];

 

3. 增多路由

在 app/Http/routes.php 文件里增加路由:

// 后台首页路由、退出登录路由
Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'adminLoginVerify'], function(){
    Route::get('index', 'IndexController@index');
    Route::get('logout', 'IndexController@logout');
});

// 后台登录路由
Route::group(['middleware' => 'web'], function(){
    Route::get('admin/login', 'Admin\IndexController@login');
});

 

那是后台Admin 目录下 Index 调节器的代码:

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

class IndexController extends Controller{

    // 后台首页
    public function index(){
        return '<h1>欢迎你,' . session('admin') . '</h1>';
    }

    // 后台登录
    public function login(){
        session(['admin' => 'mingc']);
        return '<h1>后台登录</h1>';
    }

    // 退出登陆
    public function logout(){
        session(['admin' => null]);
        return '<h1>退出登录</h1>';
    }
}

 

4. 模仿登陆

展开浏览器,访谈后台登陆页

澳门新葡新京 1

好的,访谈后台首页

澳门新葡新京 2

现今大家退出登入

澳门新葡新京 3

在脱离的场所下,访谈首页会重定向到登入页。

 

二、视图

1. 渲染视图,分配数据

办法1.数组键值对分配

// 在控制器中
$data = array(
    'title' => 'Laravel',
    'subTitle' => '高效快捷的PHP框架'
);
return view('my_laravel', $data);

// 在模板中
<?php echo $title;?>
<?php echo $subTitle;?>

  

措施2. with 方法链分配

// 在控制器中
return view('my_laravel')->with('title', 'Laravel')->with('subTitle', '高效快捷的PHP框架');

// 在模板中(和上面的一样)
<?php echo $title;?>
<?php echo $subTitle;?>

 

方法3.行使 compact(卡塔尔 函数分配

// 在控制器中
$data = array(
    'title' => 'Laravel',
    'subTitle' => '高效快捷的PHP框架'
);
$content = 'Laravel 5.2 在 5.1 基础上继续改进和优化,添加了许多新的功能特性...';
return view('my_laravel', compact('data', 'content'));

// 在模板中(和前两个不太一样)
<?php echo $data['title'] ; ?>
<?php echo $data['subTitle']; ?>
<?php echo $content; ?>

个中,view(卡塔尔(英语:State of Qatar) 函数的首先个参数 my_laravel
是视图模板名,它在resources/views 视图目录下,模板文件后缀是
.blade.php,选择了 Blade 模板引擎。

 

三、Blade 模板引擎

1. 出口变量

// 输出单个变量
{{ $var }}

// 保留双大括号,编译为{{ var }}
@{{ var }}

// 可以输出默认值
{{ $var or '我是默认值' }}
{{ isset($var) ? $var : '我是默认值' }}

// Blade 注释
{{-- 这个注释不会输出到页面中 --}}

// 忽略字符实体化,输出 JS 或 HTML
{!! $var !!}
// 注: 因为 Blade 模板引擎默认对{{}}语句进行了 htmlentities 字符实体化,所以要输出JS或HTML代码时,应使用上述语法

  

2. 流程序调整制

// if 语句
@if($var == 'laravel')
    I am laravel
@elseif($var == 'yii')
    I am yii
@else
    I don’t know what I am.
@endif

// 循环
@for ($i = 0; $i < 10; $i++)
    The current value is {{ $i }}
@endfor

@foreach ($array as $v)
    <p>我是数组成员 {{$v}}</p>
@endforeach

@forelse ($users as $v)
    <li>我的名字是{{ $v->name }}</li>
    @empty
    <p>我没有名字</p>
@endforelse

@while (true)
    <p>我一直在循环...</p>
@endwhile

// 可以嵌套
@for($i = 0; $i < 10; $i++)
    @if($i > 5)
        I am {{$i}} > 5
    @endif
@endfor

  

3. 模板结议和子视图

@include           文件包蕴指令。

@extends          模板世袭指令。

@yield               切成块定义指令(定义切成片展现地点)。

@section           切成块提供指令(定义切成片详细内容)。

@endsection      @section 的终结标识。

@show               @section
的结束标志,提供切成丝内容的还要,展现切成块。

@parent             @section 的内容标志,突显出父级模板的切成块。

@include:
包罗子视图,也正是文本包涵。

若是多个网址中的多个网页均有公共部分,例如最上端导航、侧栏推荐、尾部版权。为了便利中期维护和改造,能够把这一个网页的共用部分摘出来作为独立的文本,放到视图目录下的
common 文件夹,并各自命名称为 top.balde.php、aside.blade.php 和
bottom.blade.php 。那么在大家的依次视图模板中,能够应用 

 @include(‘common.top’卡塔尔(英语:State of Qatar)  //
将最上端导航包罗进来,其余公共部分雷同处理。

 假若急需传递变量,能够加多参数

 @include(‘common.top’, [‘location’ =>
‘首页’]) 

 

@extends: 模板世襲,世襲父级模板的构造。

在 @include 指令中,它是把摘出的模版部分含有进来。

而 @extends 指令, 则世袭了三个原来就有的主模板布局。 

前几日在视图目录下有叁个 layouts 目录,目录下有二个主模板
master.blade.php,构造如下:

<!DOCTYPE html>
<html>
<head>
    <title>@yield('title', '首页')</title>
</head>
<body>
    <div class="top">顶部</div>
    @yield('main')
    <div class="aside">侧栏</div>
    <div class="bottom">底部</div>
</body>
</html>

@yield(‘title’, ‘首页’卡塔尔(英语:State of Qatar) 指令定义了在<title>标签中体现网页标题

@yield(‘main’卡塔尔国 定义了在顶、侧栏之间显示主内容。

 

那么标题和主内容在何地呢?那就要求子模板了。

澳门新葡新京,当今我们在视图目录下新建四个子模板 child.blade.php,内容如下:

@extends('layouts.master')

@section('title')
    关于页
@endsection

@section('main')
    <div class="main">【关于页】主内容</div>
@endsection

   

概念好指向 master 主模板视图 和 child 子模板视图的路由,浏览器中拜访child 子视图

澳门新葡新京 4

 

大家看来,child 子模板继承了 master 主模板的开始和结果:最上端、侧栏、底部

况且,child 子模板也呈现了温馨的网页标题 “关于页” 和主内容
“【关于页】主内容”

这就是 master 主模板中切丝定义者 @yield 和 child 子模板中切块提供者
@section@endsection 的功绩了。

 

@yield、@section: 定义切成块和提供切条。

@yield(‘main’卡塔尔国指令定义一段HTML切成条,它提示了在此个地方显得叁个名称叫’main’的切成丝

@section(‘main’卡塔尔国@endsection 指令提供了生机勃勃段HTML切条,它为@yield(‘main’)定义的’mian’切成片提供了详实的源委。

那便是说有了切成条的来得地方,有了切成丝的详实内容,就足以显示出一个详尽的HTML切成条了。

 

相应小心到了,在主模板 master 中有像这种类型八个

@yield('title', '首页')

它提醒了 ‘title’
切块的暗许值。正是说,若无子模板世襲主模板,恐怕连续了但绝非用@section(‘title’卡塔尔国@endsection
指令提供 ‘title’ 切块,它将展现多个私下认可值 ‘首页’ 。

几眼前,直接待上访谈主模板看看

澳门新葡新京 5

对的,未有子模板用 @section(‘title’卡塔尔(قطر‎@endsection 来提供标题, @yield(‘title’, ‘首页’卡塔尔(قطر‎ 显示了 ‘title’
切成块的暗中同意值 ‘首页’。

 

那么,主模板作为网站首页的话,它的主内容呢?若是要呈现的话,难道又要写二个子模板来持续它,再用
@section@endsection
提供主内容?可不得以一贯在主模板里写四个好像@yield(‘title’, ‘首页’卡塔尔(قطر‎提供的暗中认可值呢?

自然可以,下边来重写主模板

<!DOCTYPE html>
<html>
<head>
    <title>@yield('title', '首页')</title>
</head>
<body>
    <div class="top">顶部</div>
    @section('main')
        <div class="main">【首页】主内容</div>
    @show
    <div class="aside">侧栏</div>
    <div class="bottom">底部</div>
</body>
</html>

@section(‘main’卡塔尔(قطر‎@show 可以提供 ‘main’ 切成条并显示出来。

 

最近访谈主模板看看,首页主内容出来了。

澳门新葡新京 6

还要,若是有子模板世袭,并用 @section(‘main’卡塔尔国@endsection
中也提供了生机勃勃段’main’切成片的话,那将覆 盖 主模板中的
‘main’切成条,而只展现本人定义的。雷同于面向对象的重写。

在重写了主模板后,再访谈子模板看看

澳门新葡新京 7

因为子模板中 @sectioin(‘main’卡塔尔(英语:State of Qatar)@endsection
提供了’main’切块,所以覆盖了父级中的’main’。

 

不时大概必要子模板中重写但不掩没主模板的切条内容,那么可以在子模板中动用
@parent 来展现主模板中的切条

@extends('layouts.master')

@section('title')
    关于页
@endsection

@section('main')
    @parent
    <div class="main">【关于页】主内容</div>
@endsection

 

访谈子模板

澳门新葡新京 8

呈现子模板主内容的还要,也显示了主模板的主内容。

 

相关文章