澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站laravel模板难题,模板引擎

一、中间件

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

 

layouts/master.blade.php
@section('sidebar') 这是主要的侧边栏。 @show
child.blade.php
@section('sidebar') @parent <p>这边会附加在主要的侧边栏。</p>@endsection
如果使用@show,则child页面会覆盖掉这是主要内容
如果没有@show,则child页面会显示master里面的这是主要内容,而不会显示child里面的内容

1.创建控制器 

澳门新浦京娱乐场网站 1

1. 创建中间件

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

php artisan make:middleware AdminLoginVerify

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

 

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

<?php
namespace AppHttpMiddleware;

use Closure;

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

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

 

1.{{$name}} //输出name的值 --输出变量

 php artisan make:controller StaticPagesController

HTTP视图

2. 注册中间件

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

protected $routeMiddleware = [
        'auth' => AppHttpMiddlewareAuthenticate::class,
        'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
        'can' => IlluminateFoundationHttpMiddlewareAuthorize::class,
        'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
        'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
         // 自定义中间件
        'adminLoginVerify' => AppHttpMiddlewareAdminLoginVerify::class,
    ];

 

2.@{{ $name }} @符号能够屏蔽掉模板解析 //输出@{{ $name }}--屏蔽掉模板解析

view()->compact('name','title');传递多个变量

2.blade 模板

1. 简介

视图view包含应用程序app所要渲染的HTML代码,目的是将应用的显示逻辑和控制逻辑进行分离,即分离控制器controller和网页呈现上的逻辑。Laravel的视图存放在resources/views/目录下,视图文件以.php作为后缀。

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', 'AdminIndexController@login');
});

 

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

<?php

namespace AppHttpControllersAdmin;

use AppHttpControllersController;

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>';
    }
}

 

3.{{ $name or 'default' }} //有name值,输出name值,没有值,则输出default--默认值

   @yield('content')  @extends  @section @stop

2. 视图辅助函数

view()定义在vendorlaravelframeworksrcIlluminateFoundationhelpers.php中的,调用了Factorymake()对传入的参数做处理并用这些参数初始化View类,再返回View的实例。

/**
* Get the evaluated view contents for the given view.
*
* @param  string  $view 对应resources/views目录内视图文件名称
* @param  array   $data 视图内使用的数据
* @param  array   $mergeData
* @return IlluminateViewView|IlluminateContractsViewFactory
*/
function view($view = null, $data = [], $mergeData = [])
{
   //调用了Factory
   $factory = app(ViewFactory::class);

   if (func_num_args() === 0) {
       return $factory;
   }
   //对传入的参数做处理并用这些参数初始化View类,再返回View的实例。
   return $factory->make($view, $data, $mergeData);
}

4. 模拟登录

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

澳门新浦京娱乐场网站 2

好的,访问后台首页

澳门新浦京娱乐场网站 3

现在我们退出登录

澳门新浦京娱乐场网站 4

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

 

4.{{ isset($name)?$name:"zhangsan" }}--判断变量是否存在,如果不存在则给出它一个默认值

<!DOCTYPE html>
<html>
  <head>
    <title>我的xx</title>
  </head>
  <body>
    @yield('content')
  </body>
</html>

@yield('content')  把content 作为一个可以被继承的区域 只要是继承这个地方的都已 这个页面为默认模板

//其他页面继承  //所有包含在 @section 和 @stop中的代码都将被插入到父视图的 content 区块。
//注意 当 @section 传递了第二个参数时,便不需要再通过 @stop 标识来告诉 Laravel 填充区块会在具体哪个位置结束。

3. 视图传参

通常,路由将请求交给控制器,控制器从模型中获取视图所需显示的数据,因此需要在控制器中绑定数据到视图。

  • 将数组作为绑定数据传入
$data = ['title'=>'homepage','charset'=>'UTF-8'];
$view = view('home',$data);
  • with(key,value)传统方式传递数据到视图
$view = view('home')->with('title','homepage');
  • with(key,value)链式绑定数据到视图
$view = view('home')->with('title','homepage')->with('charset','UTF-8');
  • withKey(value)魔数方法传递数据到视图
$view = view('home')->withTitle('homepage');
  • 通过属性绑定数据
$view = view('home');
$view.title = 'homepage';
  • 通过数据访问接口绑定数据
$view = view('home');
$view['title'] = 'homepage';

[案例]

class DemoController extends Controller
{
    public function index()
    {
        $title = 'homepage';
        $setting = [
            'lang' => 'zh',
            'charset' => 'utf-8',
        ];
        //使用compact()将不同类型的变量合并为关联数组
        $view = view('demo', compact('title','setting'));
        return $view;
    }
}

二、视图

5.$str = '<script>document.write("laravel")</script>';

{!! $str !!} //弹出laravel--不需要把脚本转化为实体

@include('header',['page'=>'这是首页']);
公共模板中 {{ $page }}

blade模板引擎 子视图
@include('common.header')
@include('[common.name',['data'=](])

@extends('layout.master')
引用样式href="{{ asset('resources/view/admin/style/css/admin.css') }}"
等同于 href="/resource/view/admin/style/css/admin.css";

@yield('title')
@section('sidebar')
重新生成key值: php artisan key:generate
读取配置项:config('app.debug');config()函数和env()函数是一样的
config('文件名.内容');

  @extends('layouts.default') <!--继承公用模板-->

4. 模板引擎

模板引擎需要完成最基本三项功能:

  • 变量输出
  • 流程控制
  • 引入继承

Laravel默认使用Blade模板引擎,Blade中可使用原生PHP代码输出,Blade视图模板最终都将被“编译”(正则替换)成原生PHP代码并缓存,除非模板文件被修改否则不会重新编译。Blade模板使用.blade.php作为文件扩展名。

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() 函数的第一个参数 my_laravel 是视图模板名,它在resources/views 视图目录下,模板文件后缀是 .blade.php,采用了 Blade 模板引擎。

 

  @section('title', '帮助页') <!--指定不同页面的title -->

变量输出

{{{...}}}用于转义输出
{{$name or 'defualt_value'}} 默认值输出
{{isset($name)?$name:''}} 三元条件判断

{{$var}}之间是要输出的变量内容,此种方式会与某些JS框架发生冲突,例如在AngularJS中采用{{}}进行数据绑定,因此可使用@{{ $var }}语法告知Blade渲染引擎表达式保留原样。

在Blade中@打头的都是指令,例如流程控制的输出@if...@ifend

默认使用{{$var}}语法会自动传递给PHP的htmlentities()来对变量进行HTML实体化处理以避免XSS攻击。使用{!! $var !!}可避免htmlentities()处理,进而原样输出。

三、Blade 模板引擎

  @section('content') <!--指定位置-->

流程控制

条件分支

  • 使用@i...@elseif...@else...@endif指令创建条件分支表达式。
  • 使用@unless(bool)...@endunless澳门新浦京娱乐场网站laravel模板难题,模板引擎。指令,表示除非条件满足则执行。

循环分支

  • 使用@for($i=0; $i<$length;$i )...@endfor
  • 使用@foreach($list as $item)...@endforeach
  • 使用@forelse($list as $item)...@empty...@endforelse
  • 使用@while(true)...@endwhile

结束循环或跳出当前循环

@foreach ($list as $item)
    @if ($item->status== 1)
        @continue
    @endif

    <li>{{ $item->name }}</li>

    @if ($item->count >= 100)
        @break
    @endif
@endforeach

把条件和指令声明放在同一行

@foreach ($list as $item)
    @continue($item->status == 1)
    <li>{{ $item->name }}</li>
    @break($item->count >= 100)
@endforeach

循环变量$loop的属性对于循环控制提供了很好的帮助。

@foreach ($list as $item)
    @if ($loop->first)
        迭代第一条
    @endif

    @if ($loop->last)
        迭代最后一条
    @endif

    <p>{{ $item->name }}</p>
@endforeach

循环迭代$loop属性

  • $loop->index 以索引值0开始当前循环迭代的位置下标
  • $loop->iteration 当前循环迭代从1开始
  • $loop->remaining 循环中剩余的迭代
  • $loop->count 数组中要迭代的条目总数
  • $loop->first 是否为循环中第一次迭代
  • $loop->last 是否为循环中最后一次迭代
  • $loop->depth 当前循环嵌套的层级
  • $loop->parent 嵌套循环中父级循环的$loop变量

1. 输出变量

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

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

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

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

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

  

    <h1>帮助页</h1>

引入继承

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

  

  @stop <!--结束标志-->

模板引入

Blade提供@include指令以便于在一个视图中引入另一个视图,所有父视图中变量均在被引入子视图中可用。另外可向被包含的视图传递额外数据。
@include('view.head', ['data'=>'list'])

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 指令, 则继承了一个已有的主模板布局。 

现在在视图目录下有一个 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', '首页') 指令定义了在<title>标签中显示网页标题

@yield('main') 定义了在顶、侧栏之间显示主内容。

 

那么标题和主内容在哪里呢?这就需要子模板了。

现在我们在视图目录下新建一个子模板 child.blade.php,内容如下:

@extends('layouts.master')

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

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

   

定义好指向 master 主模板视图 和 child 子模板视图的路由,浏览器中访问 child 子视图

澳门新浦京娱乐场网站 5

 

我们看到,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' 切片,它将显示一个默认值 '首页' 。

现在,直接访问主模板看看

澳门新浦京娱乐场网站 6

没错,没有子模板用 @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' 切片并显示出来。

 

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

澳门新浦京娱乐场网站 7

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

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

澳门新浦京娱乐场网站 8

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

 

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

@extends('layouts.master')

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

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

 

访问子模板

澳门新浦京娱乐场网站 9

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

 

  

模板继承

Blade提供模板继承和部件可使不同页面使用统一的布局,当定义子视图时,使用@extends指令指定子视图需继承的父视图,使用@section指令向布局的部件中注入内容。

  • @section 指令定义内部的部件
  • @yield 指令为给定部件展示内容
  • @extends 指令指定子视图所需继承的父视图

[案例] 视图的布局通常都会拥有一个统一的模板,可建立统一的基础布局模板layout.blade.php,让其他视图文件都来继承自它。

resources/view/layout.blade.php

<!doctype html>
<html lang="{{$setting['lang']}}">
<head>
    <meta charset="{{$setting['charset']}}">
    <title>@{{$title}}</title>
</head>
<body>
      @yield('content')
</body>
</html>

resources/views/demo.blade.php

@extends('layout')

@section('content')
<h1>demo page</h1>
@stop

[案例]带有侧边栏的布局
resources/view/layout.blade.php

<!doctype html>
<html lang="{{$setting['lang']}}">
<head>
    <meta charset="{{$setting['charset']}}">
    <title>@{{$title}}</title>
</head>
<body>
      <div class="sidebar">
      @section('sidebar')
      <h3>控制面板</h3>
      @show
      </div>
      <div class="content">
      @yield('content')
      </div>
</body>
</html>

resources/views/child.blade.php

@extends('layout')

@section('sidebar')
@parent
<ul>
  <li>菜单条目</li>
  <li>菜单条目</li>
  <li>菜单条目</li>
</ul>
@endsection

@section('content')
<h1>demo page</h1>
@endsection

  @include('layouts._header') //引入公共头部文件

小结

 

需要运行的前端工作流
npm run watch-poll

 

 artisan 基础命令  (php artisan help migrate 查看帮助)

 

命令 说明
php artisan key:generate 生成 App Key
php artisan make:controller 生成控制器
php artisan make:model 生成模型
php artisan make:policy 生成授权策略
php artisan make:seeder 生成 Seeder 文件
php artisan migrate 执行迁移
php artisan migrate:rollback 回滚迁移
php artisan migrate:refresh 重置数据库
php artisan db:seed 填充数据库
php artisan tinker 进入 tinker 环境
php artisan route:list 查看路由列表

  

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站laravel模板难题,模板引擎