Lavarel HTTP视图

Lavarel HTTP视图_第1张图片
HTTP视图

1. 简介

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

2. 视图辅助函数

view()定义在vendor\laravel\framework\src\Illuminate\Foundation\helpers.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 \Illuminate\View\View|\Illuminate\Contracts\View\Factory
*/
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);
}

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

4. 模板引擎

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

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

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

变量输出

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

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

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

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

流程控制

条件分支

  • 使用@i...@elseif...@else...@endif指令创建条件分支表达式。
  • 使用@unless(bool)...@endunless指令,表示除非条件满足则执行。

循环分支

  • 使用@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
 
    
  • {{ $item->name }}
  • @if ($item->count >= 100) @break @endif @endforeach

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

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

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

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

    {{ $item->name }}

    @endforeach

    循环迭代$loop属性

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

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

    模板继承

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

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

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

    resources/view/layout.blade.php

    
    
    
        
        @{{$title}}
    
    
          @yield('content')
    
    
    

    resources/views/demo.blade.php

    @extends('layout')
    
    @section('content')
    

    demo page

    @stop

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

    
    
    
        
        @{{$title}}
    
    
          
          
    @yield('content')

    resources/views/child.blade.php

    @extends('layout')
    
    @section('sidebar')
    @parent
    
    • 菜单条目
    • 菜单条目
    • 菜单条目
    @endsection @section('content')

    demo page

    @endsection

    小结

    你可能感兴趣的:(Lavarel HTTP视图)