0

0

Laravel 5.中间件和视图以及Blade 模板引擎的实例

黄舟

黄舟

发布时间:2017-09-11 10:06:39

|

1992人浏览过

|

来源于php中文网

原创

一、中间件

laravel 的 http 中间件提供了对路由的一层过滤和保护。下面模拟一下用中间件验证后台登录。

1. 创建中间件

cmd 窗口进入项目目录,使用 artisan 命令创建


php artisan make:middleware AdminLoginVerify

这将在 app/Http/Middleware 目录创建中间件 AdminLoginVerify

在 AdminLoginVerify 类的 handle()方法中添加验证逻辑:


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 控制器的代码:


欢迎你,' . session('admin') . '';
    }

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

后台登录

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

退出登录

'; } }

 

4. 模拟登录

打开浏览器,访问后台登录页

好的,访问后台首页

现在我们退出登录

在退出的状态下,访问首页会重定向到登录页。

 

二、视图

1. 渲染视图,分配数据

方法1.数组键值对分配


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

// 在模板中

方法2. with 方法链分配


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

// 在模板中(和上面的一样)

 

方法3.利用 compact() 函数分配


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

// 在模板中(和前两个不太一样)


其中,view() 函数的第一个参数 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)
    

我是数组成员 {{$v}}

@endforeach @forelse ($users as $v)
  • 我的名字是{{ $v->name }}
  • @empty

    我没有名字

    @endforelse @while (true)

    我一直在循环...

    @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') // 将顶部导航包含进来,其他公共部分同样处理。

     如果需要传递变量,可以添加参数

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

    @extends: 模板继承,继承父级模板的布局。

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

    而 @extends 指令, 则继承了一个已有的主模板布局。 

    达芬奇
    达芬奇

    达芬奇——你的AI创作大师

    下载

    现在在视图目录下有一个 layouts 目录,目录下有一个主模板 master.blade.php,布局如下:


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

    顶部

    @yield('main')

    侧栏

    底部

    @yield('title', '首页') 指令定义了在

    标签中显示网页标题<p>@yield('main') 定义了在顶、侧栏之间显示主内容。</p> <p> </p> <p>那么标题和主内容在哪里呢?这就需要子模板了。</p> <p>现在我们在视图目录下新建一个子模板 child.blade.php,内容如下:</p> <p class="cnblogs_Highlighter"><br></p><pre class="brush:php;gutter:true;">@extends('layouts.master') @section('title') 关于页 @endsection @section('main') <p class="main">【关于页】主内容</p> @endsection</pre><p>   </p> <p>定义好指向 master 主模板视图 和 child 子模板视图的路由,浏览器中访问 child 子视图</p> <p><img src="https://img.php.cn/upload/article/000/000/194/7fe0e7a2b6084928ac5070d2f267c408-3.png" alt=""></p> <p> </p> <p>我们看到,child 子模板继承了 master 主模板的内容:顶部、侧栏、底部</p> <p>同时,child 子模板也显示了自己的网页标题 “关于页” 和主内容 “【关于页】主内容”</p> <p>这就是 master 主模板中切片定义者 @yield 和 child 子模板中切片提供者 @section@endsection 的功劳了。</p> <p> </p> <p><strong>@yield、@section: 定义切片和提供切片。</strong></p> <p>@yield('main') 指令定义一段HTML切片,它指示了在这个位置显示一个名为'main'的切片</p> <p>@section('main')@endsection 指令提供了一段HTML切片,它为@yield('main') 定义的'mian'切片提供了详细的内容。</p> <p>那么有了切片的显示位置,有了切片的详细内容,就可以显示出一个详细的HTML切片了。</p> <p> </p> <p>应该注意到了,在主模板 master 中有这么一个</p> <p class="cnblogs_Highlighter"><br></p><pre class="brush:php;gutter:true;">@yield('title', '首页')</pre><p>它指示了 'title' 切片的默认值。就是说,如果没有子模板继承主模板,或者继承了但没有用@section('title')@endsection 指令提供 'title' 切片,它将显示一个默认值 '首页' 。</p> <p>现在,直接访问主模板看看</p> <p><img src="https://img.php.cn/upload/article/000/000/194/7fe0e7a2b6084928ac5070d2f267c408-4.png" alt=""></p> <p>没错,没有子模板用 @section('title')@endsection 来提供标题, <span class="cnblogs_code">@yield('title', '首页')</span> 显示了 'title' 切片的默认值 '首页'。</p> <p>那么,主模板作为网站首页的话,它的主内容呢?如果要显示的话,难道又要写一个子模板来继承它,再用 @section@endsection 提供主内容?可不可以直接在主模板里写一个类似@yield('title', '首页') 提供的默认值呢?</p> <p>当然可以,下面来重写主模板</p> <p class="cnblogs_Highlighter"><br></p><pre class="brush:html;gutter:true;"><!DOCTYPE html> <html> <head> <title>@yield('title', '首页')

    顶部

    @section('main')

    【首页】主内容

    @show

    侧栏

    底部

    @section('main')@show 可以提供 'main' 切片并显示出来。

     

    现在访问主模板看看,首页主内容出来了。

    并且,如果有子模板继承,并用 @section('main')@endsection 中也提供了一段'main'切片的话,这将覆 盖 主模板中的 'main'切片,而只显示自己定义的。类似于面向对象的重写。

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

    因为子模板中 @sectioin('main')@endsection 提供了'main'切片,所以覆盖了父级中的'main'。

     

    有时候可能需要子模板中重写但不覆盖主模板的切片内容,那么可以在子模板中使用 @parent 来显示主模板中的切片


    @extends('layouts.master')
    
    @section('title')
        关于页
    @endsection
    
    @section('main')    @parent
        

    【关于页】主内容

    @endsection

     

    访问子模板

    显示子模板主内容的同时,也显示了主模板的主内容。

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    java连接字符串方法汇总
    java连接字符串方法汇总

    本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

    7

    2026.02.05

    java中fail含义
    java中fail含义

    本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

    8

    2026.02.05

    控制反转和依赖注入区别
    控制反转和依赖注入区别

    本专题整合了控制反转和依赖注入区别、解释、实现方法相关内容。阅读专题下面的文章了解更多详细教程。

    11

    2026.02.05

    钉钉脑图插图教程合集
    钉钉脑图插图教程合集

    本专题整合了钉钉脑图怎么插入图片、钉钉脑图怎么用相关教程,阅读专题下面的文章了解更多详细内容。

    24

    2026.02.05

    python截取字符串方法汇总
    python截取字符串方法汇总

    本专题整合了python截取字符串方法相关合集,阅读专题下面的文章了解更多详细内容。

    2

    2026.02.05

    Java截取字符串方法合集
    Java截取字符串方法合集

    本专题整合了Java截取字符串方法汇总,阅读专题下面的文章了解更多详细操作教程。

    1

    2026.02.05

    java 抽象方法
    java 抽象方法

    本专题整合了java抽象方法定义、作用教程等内容,阅读专题下面的文章了解更多详细内容。

    2

    2026.02.05

    Eclipse创建jsp文件教程合集
    Eclipse创建jsp文件教程合集

    本专题整合了Eclipse创建jsp文件、创建jsp项目等等内容,阅读专题下面的文章了解更多详细教程。

    26

    2026.02.05

    java 字符串转数字
    java 字符串转数字

    本专题整合了java如何字符串转数字相关内容,阅读专题下面的文章了解更多详细教程。

    4

    2026.02.05

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Laravel---API接口
    Laravel---API接口

    共7课时 | 0.6万人学习

    PHP自制框架
    PHP自制框架

    共8课时 | 0.6万人学习

    PHP面向对象基础课程(更新中)
    PHP面向对象基础课程(更新中)

    共12课时 | 0.7万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号