一.视图

1.视图文件存放在resources/views目录
2.视图载入及传参

return view('greeting', ['name' => 'James']);

  

还可以通过with 方法添加独立的数据片段到视图
return 还可以通过with 方法添加独立的数据片段到视图

return view('greeting')->with('name', 'john');

 

也可以使用compact

return view('greeting')->compact('name','age');

  

3.判断视图是否存在

if (view()->exists('emails.customer')) {
}

4.在视图间共享数据
有时候我们需要在所有视图之间共享数据片段,这时候可以使用视图工厂的share 方法,通常,需要在服务提供者的boot 方法中调用share 方法,你可以将其添加到AppServiceProvider 或生成独立的服务提供者来存放它们:

/**
* 启动所有应用服务
*
* @return void
*/
public function boot()
{
view()->share('key', 'value');
}

  

二.视图Composer

视图 Composers 是当视图被渲染时的回调或类方法。如果你有一些数据要在视图每次渲染时都做绑定,可以使用视图 composer 将逻辑组织到一个单独的地方。

首先要在服务提供者中注册视图 Composer,我们将会使用帮助函数view 来访问Illuminate\Contracts\View\Factory 的底层实现,记住,Laravel 不会包含默认的视图 Composers 目录,我们可以按照自己的喜好组织其位置,例如可以创建一个App\Http\ViewComposers目录,新建一个Viewtest类

<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View; /**
* Created by PhpStorm.
* User: guo
* Date: 2017/5/30
* Time: 16:17
*/
class Viewtest
{
public function compose(View $view)
{
$view->with('count', '1000');
} }

  

根目录下的Providers目录新建ComposerServiceProvider类,代码如下

<?php
/**
* Created by PhpStorm.
* User: guo
* Date: 2017/5/30
* Time: 16:13
*/ namespace App\Providers; use Illuminate\Support\ServiceProvider; class ComposerServiceProvider extends ServiceProvider
{
/**
* 在容器中注册绑定
*/
public function boot()
{
view()->composer(['test.hi'], 'App\Http\ViewComposers\Viewtest');
} /**
* Register the service provider.
*
* @return void
*/
public function register()
{ }
}

  

在config下的app.php中的providers中注册该服务
App\Providers\ComposerServiceProvider::class,

这样,在渲染模板test/hi.blade.php时将有一个变量$count

可以修改ComposerServiceProvider中的boot方法,将composer作用到多个视图中

view()->composer(
['test.hi','test.hi2'],
'App\Http\ViewComposers\Viewtest'
);

  

甚至可以使用通配符

view()->composer(
'*',
'App\Http\ViewComposers\Viewtest'
);

  

当然你也可以不用新建服务,直接使用AppServiceProvider

public function boot()
{   view()->composer(['test.hi'], 'Youxin\Http\ViewComposers\Viewtest');
  //或者使用一个闭包
  view()->composer('*', function($view) {
  $view->with('user', array('name'=>'john', 'age'=>18));
  });
}

  

四,视图创建器

视图创建器和视图 composer 非常类似,不同之处在于前者在视图实例化之后立即失效而不是等到视图即将渲染。使用create 方法注册一个视图创建器

view()->creator('profile', 'App\Http\ViewCreators\ProfileCreator');

  

五.模板Blade引擎

1.模板继承 @extends('...')
2.定义一个内容片断 @yield('...')
3.替换内容片断
@section('...')
@endsection 4.扩展
@extends('layouts.master') @section('title', 'Page Title') @section('sidebar')
@parent
<p>This is appended to the master sidebar.</p>
@endsection @section('content')
<p>This is my body content.</p>
@endsection sidebar 片段使用@parent 指令来追加(而非覆盖)内容到布局中 sidebar, @parent 指令在视图渲染时将会被布局中的内容替换 5.和原生 PHP 视图一样,Blade 视图可以通过view 方法直接从路由中返回
Route::get('blade', function () {
return view('child');
}); 6.数据显示:
Route::get('greeting', function () {
return view('welcome', ['name' => 'Samantha']);
}); 模板中:
Hello, {{ $name }}. 在模板中输出函数
The current UNIX timestamp is {{ time() }}. 注意:Blade 的{{}} 语句已经经过 PHP 的htmlentities 函数处理以避免 XSS 攻击,如果不想数据被htmlentities处理,可以使用
{!! $name !!} 7.避免和javascript框架的混淆
可以使用@符号来告诉 Blade 渲染引擎该表达式应该保持原生格式不作改动
Hello, @{{ name }}. 在本例中, @ 符将会被 Blade 移除,然而, {{ name }} 表达式将会保持不变,避免被laravel框架渲染 8.默认值
{{ $name or 'Default' }}
如果$name 变量存在,其值将会显示,否则将会显示“Default” 9.流程控制
@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif 为方便起见,Blade 还提供了@unless 指令
@unless (Auth::check())
You are not signed in.
@endunless 10.循环
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor @foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach @forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>No users</p>
@endforelse @while (true)
<p>I'm looping forever.</p>
@endwhile 11.包含子视图
Blade 的@include 指令允许你很简单的在一个视图中包含另一个 Blade 视图,所有父级视图中变量在被包含的子视图中依然有效 <div>
@include('shared.errors')
<form>
<!-- Form Contents -->
</form>
</div> 尽管被包含的视图继承所有父视图中的数据,你还可以传递额外参数到被包含的视图
@include('view.name', ['some' => 'data']) 12.注释
Blade 还允许你在视图中定义注释,然而,不同于 HTML 注释,Blade 注释并不会包含到 HTML 中被返回:
{{-- This comment will not be present in the rendered HTML --}}

  

五.服务注入

@inject 指令可以用于从服务容器中获取服务,传递给@inject 的第一个参数是服务将要被放置到的变量
名,第二个参数是要解析的服务类名或接口名:

@inject('metrics', 'App\Services\MetricsService')
<div>
Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>

  

六.扩展Blade

Blade 甚至还允许你自定义指令,可以使用directive 方法来注册一个指令。当 Blade 编译器遇到该指令,将会传入参数并调用提供的回调。 下面的例子创建了一个@datetime($var) 指令:

<?php
namespace App\Providers;
use Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Blade::directive('datetime', function($expression) {
return "<?php echo with{$expression}->format('m/d/Y H:i'); ?>";
});
}
/**
* 在容器中注册绑定.
*
* @return void
*/
public function register()
{
//
}
}

  

Laravel之视图和Blade模板引擎的更多相关文章

  1. Laravel 5.2 三、中间件、视图与 Blade 模板引擎

    一.中间件 Laravel 的 HTTP 中间件提供了对路由的一层过滤和保护.下面模拟一下用中间件验证后台登录. 1. 创建中间件 cmd 窗口进入项目目录,使用 artisan 命令创建 php a ...

  2. laravel框架总结(二) -- blade模板引擎

    ## 1.基本用法 ##情形1 $name = laravel5 <div class="title"> {{$name}} {{$name}}</div> ...

  3. laravel Blade 模板引擎

    与视图文件紧密关联的就是模板代码,我们在视图文件中通过模板代码和 HTML 代码结合实现视图的渲染.和很多其他后端语言不同,PHP 本身就可以当做模板语言来使用,但是这种方式有很多缺点,比如安全上的隐 ...

  4. PHP laravel 5.0 Blade 模板引擎 Api使用备注

    PHP laravel 5.0 Blade 模板引擎 Api使用备注 /** * PHP laravel 5.0 Blade 模板引擎 Api使用备注 **/ //子模版中开头,调用@extends( ...

  5. Laravel 5.1 Blade模板引擎

    为什么要使用blade 它是干什么用的? blade模板引擎使我们写HTML页面的地方,使用它是因为它能给我们提供很多的遍历,减少代码的重复率 提高开发效率.我们写blade的路径是 resource ...

  6. PHP 安全三板斧:过滤、验证和转义之转义篇 & Blade模板引擎避免XSS攻击原理探究

    PHP 转义 实现 把输出渲染成网页或API响应时,一定要转义输出,这也是一种防护措施,能避免渲染恶意代码,造成XSS攻击,还能防止应用的用户无意中执行恶意代码. 我们可以使用前面提到的 htmlen ...

  7. 为 Blade 模板引擎添加新文件扩展名

    因为一些原因,我准备把 Blessing Skin 的框架换成 Laravel 了(之前是自己搭建的一个框架),但是在模板迁移的时候遇到了一点问题. 之前我是使用的 XiaoLer/blade 这个从 ...

  8. 用 php 实现一个视图组件和模板引擎——基础

    只要不是做后端接口开发和一些作为守护进程之类的服务器脚本,大多数时候都是在和浏览器打交道,因此合理组织并展现 html 标签是最为常见的工作.一般大家使用框架时,都会自带有一套视图组件和模板引擎. 我 ...

  9. laravel框架之blade模板引擎

    ## 1.基本用法 ##情形1 $name = laravel5 <div class="title"> {{$name}} {{$name}}</div> ...

随机推荐

  1. Cocos2d-x中图字原理之深入分析

    http://cache.baiducontent.com/c?m=9d78d513d9921cfe05ac94281a16a632451294247c89df4f3992d15f9217465c02 ...

  2. 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】

    转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...

  3. 明远智睿IMX6Q Android4.4.2移植USBWIFI(RTL8188EUS)

    移植过程中得到网友的不少帮助,很感谢!为了让更多的网友不像我这样折腾,特写此文以做参照.过程中主要参考< Realtek_Wi-Fi_SDK_for_Android_KK_4_4.pdf > ...

  4. python登陆github

    #!/usr/bin/env python # encoding: utf-8 import requests from headers import headers from lxml import ...

  5. 向PE文件中空白处添加代码

    // mem.cpp : 定义控制台应用程序的入口点. //PE文件从文件加载到内存,再从内存读取,然后存盘到文件 #include "stdafx.h" #include < ...

  6. ASPOSE.WORD 另存为HTML

    var fi = new FileInfo(Environment.CurrentDirectory + "\\AE9302C0-AE48-4F4B-8489-6A428D9163C9_AL ...

  7. [BZOJ1082][SCOI2005]栅栏 二分+搜索减枝

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2430  Solved: 1034[Submit][Status ...

  8. 牛客网 暑期ACM多校训练营(第二场)D.money-贪心 or 动态规划

    D.money 贪心,直接贴官方的题解吧. 题目大意 你要按照顺序依次经过n个商店,每到达一个商店你可以购买一件商品,也可以出售你手中的商品. 同一时刻你手上最多拿一件商品.在第i个商店购买和出售的代 ...

  9. (转)MYSQL 的 WITH ROLLUP

    使用 GROUP BY 的 WITH ROLLUP 字句可以检索出更多的分组聚合信息,它不仅仅能像一般的 GROUP BY 语句那样检索出各组的聚合信息,还能检索出本组类的整体聚合信息. 下面我们的例 ...

  10. 阿里云ECS在CentOS 6.9中使用Nginx提示:nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)的解决方法

    说明: 1.[::]:80这个是IPv6的地址. 2.阿里云截至到今天还不支持IPv6. 解决方式: 1.普通解决方式:开启IPv6的支持,不过这个方法在阿里云行不通. vim /etc/nginx/ ...