Laravel 5.中介軟體和視圖以及Blade 模板引擎的實例

黄舟
發布: 2023-03-15 21:54:01
原創
1759 人瀏覽過

一、中間件

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( 'title', '首頁') 指令定義了在標籤中顯示網頁標題</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;gutter:true;">@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="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><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;gutter:true;">@yield(&#39;title&#39;, &#39;首页&#39;)</pre><div class="contentsignin">登入後複製</div></div><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(&#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:html;gutter:true;"><!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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板