Laravel 的 HTTP 中介軟體提供了路由的一層過濾和保護。下面模擬一下用中間件驗證後台登入。
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
在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, ];
在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>'; } }
開啟瀏覽器,造訪後台登入頁
的,造訪後台首頁
現在我們登出登入
在登出的狀態下,造訪首頁會重新導向到登入頁。
方法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() 函數的第一個參數my_laravel 是視圖模板名,它在resources/views 視圖目錄下,模板檔案後綴是.blade.php,採用了Blade模板引擎。
// 输出单个变量 {{ $var }} // 保留双大括号,编译为{{ var }} @{{ var }} // 可以输出默认值 {{ $var or '我是默认值' }} {{ isset($var) ? $var : '我是默认值' }} // Blade 注释 {{-- 这个注释不会输出到页面中 --}} // 忽略字符实体化,输出 JS 或 HTML {!! $var !!} // 注: 因为 Blade 模板引擎默认对{{}}语句进行了 htmlentities 字符实体化,所以要输出JS或HTML代码时,应使用上述语法
// 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
@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 指令, 則繼承了一個已有的主模板佈局。
現在在視圖目錄下有一個layouts 目錄,目錄下有一個主模板master.blade.php,佈局如下:
<!DOCTYPE html> <html> <head> <title>@yield('title', '首页')</title> </head> <body> <p class="top">顶部</p> @yield('main') <p class="aside">侧栏</p> <p class="bottom">底部</p> </body> </html>
@yield( 'title', '首頁') 指令定義了在
@yield('main') 定義了在頂、側邊欄之間顯示主內容。
那麼標題和主內容在哪裡呢?這就需要子模板了。
現在我們在視圖目錄下新建一個子模板child.blade.php,內容如下:
@extends('layouts.master') @section('title') 关于页 @endsection @section('main') <p class="main">【关于页】主内容</p> @endsection
##定義好指向master 主模板視圖和child 子模板視圖的路由,瀏覽器中存取child 子視圖
#
我們看到,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' 切片,它将显示一个默认值 '首页' 。
现在,直接访问主模板看看
没错,没有子模板用 @section('title')@endsection 来提供标题, @yield('title', '首页') 显示了 'title' 切片的默认值 '首页'。
那么,主模板作为网站首页的话,它的主内容呢?如果要显示的话,难道又要写一个子模板来继承它,再用 @section@endsection 提供主内容?可不可以直接在主模板里写一个类似@yield('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 <p class="main">【关于页】主内容</p> @endsection
访问子模板
显示子模板主内容的同时,也显示了主模板的主内容。
以上是Laravel 5.中介軟體和視圖以及Blade 模板引擎的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!