Laravel之视图和Blade模板引擎

一.视图

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()
    {

    }
}

  

在app.config的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()
	{
		//
	}
}

  

时间: 2024-12-15 10:50:28

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

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

## 1.基本用法 ##情形1 $name = laravel5 <div class="title"> {{$name}} {{$name}}</div> //输出结果是 larave5 larave5 ##情形2 $name = laravel5 并且使用@的情形 <div class="title"> {{$name}} @{{$name}}</div> //输出结果是 larave5{{$name}} ##情形

Laravel 5.1 Blade模板引擎

为什么要使用blade 它是干什么用的? blade模板引擎使我们写HTML页面的地方,使用它是因为它能给我们提供很多的遍历,减少代码的重复率 提高开发效率.我们写blade的路径是 resources/view 下,它的文件名后缀是blade.php. 1 继承 继承是相当爽的,它可以从主模板继承所有代码,以免大量的代码重复.这样说比较片面,具体看眼代码吧. 1.1 模板继承拓展 代码片段 首先先创建一个 admin/layout.blade.php: <!DOCTYPE html> <

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

只要不是做后端接口开发和一些作为守护进程之类的服务器脚本,大多数时候都是在和浏览器打交道,因此合理组织并展现 html 标签是最为常见的工作.一般大家使用框架时,都会自带有一套视图组件和模板引擎. 我们不讨论这些组件和引擎的好坏.因为这些东西已经经过考验,可以在生产环境下使用.我们现在只是为了学习一些东西,这时候了解一些原理上的可能对以后的帮助更大,如果一些人真的很有时间,利用这些基础知识完全可以写一个自己的组件,即可当做练习,也可以拿去自用. 好了,说这么多,我还是希望很多人明白,视图和模板引

laravel框架(blade模板引擎)

## 1.基本用法 ```##情形1  $name = laravel5<div class="title"> {{$name}}  {{$name}}</div>//输出结果是  larave5  larave5 ##情形2  $name = laravel5  并且使用@的情形<div class="title"> {{$name}}  @{{$name}}</div>//输出结果是  larave5{{$name

Laravel学习第一天(创建laravel项目、路由、视图、blade模板)

创建laravel项目 composer create-project laravel/laravel learnlv 4.1.* 查看帮助:composer create-project 使用artisan工具 生成key:php artisan key:genrate,更多命令见:http://blog.luoyunshu.com/laravel-cheatsheet 路由 route.php: <?php /* |--------------------------------------

Laravel 模板引擎Blade中标签详细介绍

这篇文章主要介绍了Laravel模板引擎Blade中section的一些标签的区别介绍,需要的朋友可以来看看. Laravel 框架中的Blade模板引擎很好用,但是官方文档介绍的并不详细,我接下来将详细的介绍下: @yield与@section 首先,@yield是不可拓展的,如果你要定义的部分没有默认内容让子模版扩展,那么用@yield($name,$default)的形式会比较方便,如果你在子模版中并没有指定这个区块的内容,它就会显示默认内容,如果定义了,就会显示你定义的内容. 与之比较,

Laravel模板引擎Blade中section的一些标签的区别介绍

Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚.比如,使用中可能会遇到这样的问题: [email protected] 和 @section 都可以预定义可替代的区块,这两者有什么区别呢?[email protected] 可以用 @show, @stop, @overwrite 以及 @append 来结束,这三者又有什么区别呢? 本文试对这些问题做一个比较浅显但是直观的介绍. @yield 与

Laravel5.1学习笔记8 Blade模板

简介 模板继承 定义一个页面布局模板 扩展一个页面布局模板 展示数据 控制语法的结构 Service Injection 扩展 Blade   简介 Blade 是 Laravel 提供的一个既简单又强大的模板引擎.和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图(view)中使用原生 PHP 代码.所有 Blade 视图页面都将被编译成原生 PHP 代码并缓存起来,除非你的模板文件被修改了,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何额外负担.Bla

laravel使用的模板引擎 blade

使用blade引擎的话必须在控制器中使用use   Blade 模板文件使用“模板名”+.blade.php结尾. 如home.blade.php 在模板中调用数组数据进行循环: 结果如下: