前言


一、大纲

From: https://www.imooc.com/video/12509

Blade视图页面 --> 编译 --> 原生PHP --> 并缓存起来。

既然是个模板:通用的“头部”和“尾部”。

二、添加模板文件 (.blade.php)

Blade 模板


一、模板继承

  • 定义布局 - [1]

section, yield, extends, parent四个关键字。

[resources/views/layouts.blade.php]

  • 初步理解关键字

@section

定义视图片段。

@yield

类似占位符,显示某个制定section所代表的内容。用子模板去实现它。

不可扩展。只是声明了一个视图片段。

  • 加载布局

Route --> Controller --> template for view.

[1]  路由

Route::any('section1', ['uses' => 'StudentController@section1']);

[2]  控制器

public function section1()
{
  return view('student.section1');  // 渲染模板
}

student/section1可以;student.section1也可以,但推荐后者。

[3]  视图 加载布局

新建 resources/views/student/section1.blade.php

Jeff: 这里,视图继承了layouts的内容。

@extends('layouts')

这样,便加载了默认 resources/views 下的 layouts.blade.php。

  • 继承布局 - [2]

先通过 @extends 继承父模板主体。

其实就是“重写布局”局部内容。

 

  • 若干疑难点

[1] yield与section的区别?

** 初步理解:

- @yield() 可以理解为一个占位符。
- @section('head') 表示一个存储区域,这个区域内定义的内容,在子模板中可以通过 @parent 进行调用。

** 不能被扩展如何理解:

@yield 不能被扩展,所以即使加上了 @parent 也不起作用,输出的内容只有“新的标题”,替换了“默认的标题”。

@section 定义的部分,由于使用了 @parent 关键字,父模板中的内容会被保留,然后再扩展后添加的内容进去。

[2] @section ... @stop ... @show ... @endsection

Ref: Laravel5.4初试-@yield @section @show @stop @append标签区别

Ref: Blade 模板中有关 section 的那些事【这才是原文】

** @endsection

这个在 4.0 版本中已经被移除,虽然向下兼容,但是不建议使用

** @show 与 @stop

@show 指的是执行到此处时将该 section 中的内容输出到页面,

@stop 则只是进行内容解析,并且不再处理当前模板中后续对该section的处理,除非用 @override覆盖(详见下一部分)。

通常来说,在首次定义某个 section 的时候,应该用 @show;而在替换它或者扩展它的时候,不应该用 @show,应该用 @stop。

{{-- layout.master --}}
<div id="zoneA">
  @section('zoneA')
  AAA
  @show
</div> <div id="zoneB">
  @section('zoneB')
  BBB
  @stop
</div> <div id="zoneC">
  @section('zoneC')
  CCC
  @show
</div> ---------------------------------------------------
代码如下:
{{-- page.view --}}
@extends('layout.master') @section('zoneA')
aaa
@stop @section('zoneB')
bbb
@stop @section('zoneC')
ccc
@show

最终显示结果:

从结果可以看到,zoneB 的内容丢失,因为没有用 @show 告诉引擎输出这部分的内容,而 zoneC 的内容会显示两次,并且还破坏了 layout.master 的页面结构,因为 @show 出现了两次。

ccc // 来自 page.view
<div class="zoneA">
aaa
</div> <div class="zoneB"> </div> <div class="zoneC">
ccc
</div>

一个理解: 

@section('content')
<h1>Test</h1>
@show
is equivalent to @section('content')
<h1>Test</h1>
@stop @yield('content')

二、模板调用PHP

  • view 使用 "变量 from controller"

Controller中定义了一个变量:

public function section1()
{
  $name = 'sean‘ ;
  return view('student.section1', [
    'name' => $name
  ]);
}

view的模板文件 [resources/views/student/section1.blade.php]:

@section('content')
content <p>{{ $name }} </p>
@stop

效果如下:

  • 直接调用php代码

[1] 视图中使用代码如下:

其中最后一样的or写法是上一行三元表达式的替代写法在blade中。

[2] 控制器中定义变量。

public function section1()
{
  $name = 'sean‘;
  $arr = ['sean', 'imooc'];
  return view('student.section1', [
    'name' => $name,
    'arr' => $arr,
  ]);
}
  • 转移字符@
<p>@{{ $name }}</p>
  • 模板中注释

模板的注释在解析后的html中是看不到的。

<!-- 一二三 -->    # php注释

{{-- 四五六 --}}    # 模板注释,用于比较隐私的注释方法

三、include的使用

  • 类似子函数

引入子视图,不是都需要,但用的地方也不少。

[1] Create sub-view as common1.blade.php

[2] sub-view,相当于 "将被调用" 的子函数。

<p> 我是include {{ $message }}</p>

[3] main-view 调用 sub-view 如下。

@include('student.common1', ['message' => '我是错误信息'])

这里,调用了student目录下的common1.blade.php,并给参数message传入了一个值:'我是错误信息'
  • 实际使用示范

有点占位符的意思。

四、流程控制

  • 条件判断

[1] 视图中可以使用if foreach等。

<br>
@if ($name == 'sean')
  I'm sean
@elseif ($name == 'imooc')
  I'm imooc
@else
  Who am I?
@endif <br>
@If (in_array($name, $arr))
  true
@else
  false
@endif

[2] unless 相当于 if 取反。

<br>
@unless($name == 'sean')
  I'm sean
@endunless
  • 循环遍历

方法一

<br>
@for ($i = 0; $i < 10; $i++)
  <p>{{ $i }}</p>
#endfor 方法二 <br>
@foreach($students as $student)
  <p>{{ $student->name }}</p>
@endforeach
方法三
<br>
@forelse($students as $student)
  <p>{{ $student->name }}</p>
@empty
  <p>null</p>
@endforelse

五、模板中的URL

  • 点击链接后跳转到这里

[1]  路由

[app/Http/routes.php]

Route::any('url', ['as' => 'url', 'uses' => 'StudentController@urlTest']);

[2] 路由 --> 控制函数

[app/Http/Controllers/StudentController.php]

public function urlTest()
{
  return 'urlTest';  
}
  • 建立这个链接

在此,section1中添加一个链接:url()

看上去,貌似以下三个调用的分别是Route的那行代码的三个不同的部分。

方式一
<a href="{{ url('url') }}">url()</a> 方式二
<a href="{{ action('StudentController@urlTest') }}">action()</a>  # 写得太长 方式三
<a href="{{ route('url') }}">route()</a>

添加后效果:

[Laravel] 04 - Blade templates的更多相关文章

  1. TODO:Laravel 使用blade标签布局页面

    TODO:Laravel 使用blade标签布局页面 本文主要介绍Laravel的标签使用,统一布局页面.主要用到到标签有@yield,@ stack,@extends,@section,@stop, ...

  2. laravel 模板 blade

    控制器布局 在Laravel框架中使用模板的一种方法就是通过控制器布局.通过在控制器中指定 layout 属性,对应的视图会被创建并且作为请求的默认返回数据. 在控制器中定义一个布局 class Us ...

  3. Laravel 4 Blade模板引擎

    http://my.oschina.net/5say/blog/201290 模板输出 基本输出 1 <!-- app/views/example.blade.php --> 2 < ...

  4. Laravel 解决blade模板转义html标签问题

    当我们使用富文本编译器(如:Ueditor编译器)保存编辑的内容后,在blade模板中,想要显示原生的html标签内容时该怎么做? 首先,了解下laravel {{ 变量名 }} 与{!! 变量名 ! ...

  5. laravel的blade模板的布局嵌套

    测试路由 Route::get('/', function() { $value = [,,]; return view('home.index', array('data' => $value ...

  6. laravel中Blade模板继承

    Blade模板继承 和 区块 <!-- 文件保存于 resources/views/layouts/app.blade.php --> <html> <head> ...

  7. js中写laravel模板blade语法和PHP逻辑解决方法

    在js中是否能够执行blade的语法?或者说在js中能否处理PHP逻辑呢? 答案是,当然的 下面来看需求:在提交表单,完成入库操作后,使用 return redirect(route('admin.u ...

  8. [Code::Blocks] Install wxWidgets & openCV

    The open source, cross platform, free C++ IDE. Code::Blocks is a free C++ IDE built to meet the most ...

  9. 本人SW知识体系导航 - Programming menu

    将感悟心得记于此,重启程序员模式. js, py, c++, java, php 融汇之全栈系列 [Full-stack] 快速上手开发 - React [Full-stack] 状态管理技巧 - R ...

随机推荐

  1. 如何在生产环境使用Btrace进行调试

    占小狼 转载请注明原创出处,谢谢! 背景 记得前几天有人问我:在生产环境中可能经常遇到各种问题,你们一般是如何进行调试的? 很惭愧,没有经验.因为平时碰不到生产环境的服务器,定位问题需要各种数据,所以 ...

  2. aglio报错解决

    Cannot write or read cache for themes (ENOENT on cache folder) aglio -i ./api.md -o api.html >> ...

  3. 分布式文件系统---GlusterFS

    1.1 分布式文件系统 1.1.1 什么是分布式文件系统 相对于本机端的文件系统而言,分布式文件系统(英语:Distributed file system, DFS),或是网络文件系统(英语:Netw ...

  4. JAVA消息服务JMS规范及原理详解

    JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...

  5. ORA-16447 Redo apply was not active at the target standby database

    Cause ALTER SYSTEM FLUSH REDO TO STANDBY failed because redo apply is not active at the target datab ...

  6. expdp ORA-39070:Unable to open the log file

    Oracle中,当执行expdp或impdp的时候,有时候会出现错误: [oracle@bi-dw ~]$ expdp dp_user/dp_password@dw directory=expdp_d ...

  7. 用 CPI 火焰图分析 Linux 性能问题

    https://yq.aliyun.com/articles/465499 用 CPI 火焰图分析 Linux 性能问题   yangoliver 2018-02-11 16:05:53 浏览1076 ...

  8. Junit学习笔记之五:MockMVC

    原文:https://blog.csdn.net/xiao_xuwen/article/details/52890730 随着RESTful Web Service的流行,测试对外的Service是否 ...

  9. ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

    开发说测试环境在删除表的时候,报了如下错误: SQL> drop table tke purge; drop table tke purge * ERROR at line 1: ORA-000 ...

  10. MDK-ARM输出HEX文件重命名设置

    输出的可执行文件和库的名称就是在这里定义.比如我们常见输出Hex文件,其名称就是这里定义的.