目录
一、中间件
1. 创建中间件
2. 注册中间件
3. 添加路由
4. 模拟登录
二、视图
1. 渲染视图,分配数据
三、Blade 模板引擎
1. 输出变量
2. 流程控制
3. 模板布局和子视图
首页 后端开发 php教程 Laravel 5.中间件和视图以及Blade 模板引擎的实例

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

Sep 11, 2017 am 10:06 AM
blade laravel 中间件

一、中间件

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(&#39;admin&#39;)){ // 如果没有登录则定向到登录页
            return redirect(&#39;admin/login&#39;);
        }
        return $next($request);
    }
}
登录后复制

ok,现在就创建并定义好了验证登录的中间件 AdminLoginVerify

2. 注册中间件

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


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

3. 添加路由

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


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

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

这是后台Admin 目录下 Index 控制器的代码:


<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

class IndexController extends Controller{

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

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

    // 退出登陆
    public function logout(){
        session([&#39;admin&#39; => null]);
        return &#39;<h1>退出登录</h1>&#39;;
    }
}
登录后复制

4. 模拟登录

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

好的,访问后台首页

现在我们退出登录

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

二、视图

1. 渲染视图,分配数据

方法1.数组键值对分配


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

// 在模板中
<?php echo $title;?>
<?php echo $subTitle;?>
登录后复制

方法2. with 方法链分配


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

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

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


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

// 在模板中(和前两个不太一样)
<?php echo $data[&#39;title&#39;] ; ?>
<?php echo $data[&#39;subTitle&#39;]; ?>
<?php echo $content; ?>
登录后复制

其中,view() 函数的第一个参数 my_laravel 是视图模板名,它在resources/views 视图目录下,模板文件后缀是 .blade.php,采用了 Blade 模板引擎。

三、Blade 模板引擎

1. 输出变量


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

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

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

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

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

2. 流程控制


// if 语句
@if($var == &#39;laravel&#39;)
    I am laravel
@elseif($var == &#39;yii&#39;)
    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(&#39;common.top&#39;) // 将顶部导航包含进来,其他公共部分同样处理。
登录后复制

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

 @include(&#39;common.top&#39;, [&#39;location&#39; => &#39;首页&#39;])
登录后复制

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

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

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

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


<!DOCTYPE html>
<html>
<head>
    <title>@yield(&#39;title&#39;, &#39;首页&#39;)</title>
</head>
<body>
    <p class="top">顶部</p>
    @yield(&#39;main&#39;)
    <p class="aside">侧栏</p>
    <p class="bottom">底部</p>
</body>
</html>
登录后复制

@yield(&#39;title&#39;, &#39;首页&#39;) 指令定义了在标签中显示网页标题</p><p>@yield('main') 定义了在顶、侧栏之间显示主内容。</p><p> </p><p>那么标题和主内容在哪里呢?这就需要子模板了。</p><p>现在我们在视图目录下新建一个子模板 child.blade.php,内容如下:</p><p class="cnblogs_Highlighter"><br/></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>@extends(&#39;layouts.master&#39;) @section(&#39;title&#39;) 关于页 @endsection @section(&#39;main&#39;) <p class="main">【关于页】主内容</p> @endsection</pre><div class="contentsignin">登录后复制</div></div><p>   </p><p>定义好指向 master 主模板视图 和 child 子模板视图的路由,浏览器中访问 child 子视图</p><p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/194/7fe0e7a2b6084928ac5070d2f267c408-3.png" class="lazy" 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><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>@yield(&#39;title&#39;, &#39;首页&#39;)</pre><div class="contentsignin">登录后复制</div></div><p>它指示了 'title' 切片的默认值。就是说,如果没有子模板继承主模板,或者继承了但没有用@section('title')@endsection 指令提供 'title' 切片,它将显示一个默认值 '首页' 。</p><p>现在,直接访问主模板看看</p><p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/194/7fe0e7a2b6084928ac5070d2f267c408-4.png" class="lazy" alt=""/></p><p>没错,没有子模板用 @section('title')@endsection 来提供标题, <span class="cnblogs_code">@yield(&#39;title&#39;, &#39;首页&#39;)</span> 显示了 'title' 切片的默认值 '首页'。</p><p>那么,主模板作为网站首页的话,它的主内容呢?如果要显示的话,难道又要写一个子模板来继承它,再用 @section@endsection 提供主内容?可不可以直接在主模板里写一个类似@yield(&#39;title&#39;, &#39;首页&#39;) 提供的默认值呢?</p><p>当然可以,下面来重写主模板</p><p class="cnblogs_Highlighter"><br/></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><!DOCTYPE html> <html> <head> <title>@yield(&#39;title&#39;, &#39;首页&#39;)

顶部

@section('main')

【首页】主内容

@show

侧栏

底部

登录后复制

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

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

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

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

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

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


@extends(&#39;layouts.master&#39;)

@section(&#39;title&#39;)
    关于页
@endsection

@section(&#39;main&#39;)    @parent
    <p class="main">【关于页】主内容</p>
@endsection
登录后复制

 

访问子模板

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

以上是Laravel 5.中间件和视图以及Blade 模板引擎的实例的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Laravel - Artisan 命令 Laravel - Artisan 命令 Aug 27, 2024 am 10:51 AM

Laravel - Artisan 命令 - Laravel 5.7 提供了处理和测试新命令的新方法。它包括测试 artisan 命令的新功能,下面提到了演示?

Laravel和CodeIgniter的最新版本对比 Laravel和CodeIgniter的最新版本对比 Jun 05, 2024 pm 05:29 PM

Laravel9和CodeIgniter4的最新版本提供了更新的特性和改进。Laravel9采用MVC架构,提供数据库迁移、身份验证和模板引擎等功能。CodeIgniter4采用HMVC架构,提供路由、ORM和缓存。在性能方面,Laravel9的基于服务提供者设计模式和CodeIgniter4的轻量级框架使其具有出色的性能。在实际应用中,Laravel9适用于需要灵活性和强大功能的复杂项目,而CodeIgniter4适用于快速开发和小型应用程序。

Laravel 和 CodeIgniter 中数据处理能力的比较如何? Laravel 和 CodeIgniter 中数据处理能力的比较如何? Jun 01, 2024 pm 01:34 PM

比较Laravel和CodeIgniter的数据处理能力:ORM:Laravel使用EloquentORM,提供类对象关系映射,而CodeIgniter使用ActiveRecord,将数据库模型表示为PHP类的子类。查询构建器:Laravel具有灵活的链式查询API,而CodeIgniter的查询构建器更简单,基于数组。数据验证:Laravel提供了一个Validator类,支持自定义验证规则,而CodeIgniter的验证功能内置较少,需要手动编码自定义规则。实战案例:用户注册示例展示了Lar

java框架中管理中间件复用和资源共享 java框架中管理中间件复用和资源共享 Jun 01, 2024 pm 03:10 PM

Java框架支持中间件复用和资源共享,包括以下策略:通过连接池管理预先建立的中间件连接。利用线程局部存储将中间件连接与当前线程关联。使用线程池管理可重用的线程。通过本地或分布式缓存存储经常访问的数据副本。

Laravel和CodeIgniter:哪种框架更适合大型项目? Laravel和CodeIgniter:哪种框架更适合大型项目? Jun 04, 2024 am 09:09 AM

在选择大型项目框架时,Laravel和CodeIgniter各有优势。Laravel针对企业级应用程序而设计,提供模块化设计、依赖项注入和强大的功能集。CodeIgniter是一款轻量级框架,更适合小型到中型项目,强调速度和易用性。对于具有复杂需求和大量用户的大型项目,Laravel的强大功能和可扩展性更合适。而对于简单项目或资源有限的情况下,CodeIgniter的轻量级和快速开发能力则更为理想。

Laravel 和 CodeIgniter 对于初学者来说哪一个更友好? Laravel 和 CodeIgniter 对于初学者来说哪一个更友好? Jun 05, 2024 pm 07:50 PM

对于初学者来说,CodeIgniter的学习曲线更平缓,功能较少,但涵盖了基本需求。Laravel提供了更广泛的功能集,但学习曲线稍陡。在性能方面,Laravel和CodeIgniter都表现出色。Laravel具有更广泛的文档和活跃的社区支持,而CodeIgniter更简单、轻量级,具有强大的安全功能。在建立博客应用程序的实战案例中,Laravel的EloquentORM简化了数据操作,而CodeIgniter需要更多的手动配置。

Laravel 和 CodeIgniter 的模板引擎哪一个更好? Laravel 和 CodeIgniter 的模板引擎哪一个更好? Jun 03, 2024 am 11:30 AM

比较了Laravel的Blade和CodeIgniter的Twig模板引擎,根据项目需求和个人偏好进行选择:Blade基于MVC语法,鼓励良好代码组织和模板继承。Twig是第三方库,提供灵活语法、强大过滤器、扩展支持和安全沙箱。

Laravel和CodeIgniter:哪种框架更适合小型项目? Laravel和CodeIgniter:哪种框架更适合小型项目? Jun 04, 2024 pm 05:29 PM

对于小型项目,Laravel适用于大型项目,需要强大的功能和安全性。CodeIgniter适用于非常小的项目,需要轻量级和易用性。

See all articles