laravel8学习-3

jiang 发表于2021-02-15 14:11:56 最后修改于2025-01-22 13:04:44 4287

视图

判断视图是否存在

果需要判断视图是否存在,可调用 View 门面上的 exists 方法,如果视图在磁盘存在则返回 true

use Illuminate\Support\Facades\View;

if (View::exists('emails.customer')) {
    //
}

选取有效视图

使用视图上的 first 方法可以返回数组中存在的视图的第一个视图,这在你的应用或扩展包允许自定义或覆盖视图时很有用:

// 若存在custom.admin视图则使用custom.admin视图,否则使用存在的admin视图
return view()->first(['custom.admin', 'admin'], $data);

//当然,也可以调用 View 门面上的 first 方法来创建:
use Illuminate\Support\Facades\View;

return View::first(['custom.admin', 'admin'], $data);

传递数据到视图

$name="jojo";
$age=12;
return view('greetings', compact('name','age'));
return view('greetings', compact(['name','age']));
return view('greetings', ['name' => 'jojo','age'=>12]);
return view('greeting')->with(['name' => 'jojo','age'=>12]);

共享数据到视图

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

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 启动所有应用服务
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }

    /**
     * 注册服务提供者
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

视图 Composer

Blade 模板引擎

模板继承

定义父模板

<!-- 存放在 resources/views/layouts/app.blade.php -->

<html>
    <head>
        <title>应用名称 - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            这里是侧边栏
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

使用模板

定义子页面的时候,可以使用 Blade 的 @extends 指令来指定子页面所继承的布局,继承一个 Blade 布局的视图可以使用 @section 指令注入内容到布局定义的内容片段中,记住,如上面例子所示,这些片段的内容将会显示在布局中使用 @yield 的地方:

<!-- 存放在 resources/views/child.blade.php -->

@extends('layouts.app')

@section('title', 'Laravel学院')

@section('sidebar')
    @parent
    <p>Laravel 学院致力于提供优质 Laravel 中文学习资源</p>
@endsection

@section('content')
    <p>这里是主体内容,完善中...</p>
@endsection

在本例中,sidebar 片段使用 @parent 指令来追加(而非覆盖)内容到继承布局的侧边栏,@parent 指令在视图渲染时将会被布局中的内容替换。sidebar 部分以 @endsection 结束而不是 @show@endsection 指令只是定义一个 section 而 @show 指令定义并立即返回这个 section。@yield 指令还接受一个默认值作为第二个参数,这个值会在被 yield 的 section 未定义时被渲染:

@yield('content', View::make('view.name'))

包含视图

Blade 的 @include 指令允许你很轻松地在一个视图中包含另一个 Blade 视图,所有父级视图中变量在被包含的子视图中依然有效,尽管被包含的视图可以继承所有父视图中的数据,你还可以传递额外参数到被包含的视图,当然,如果你尝试包含一个不存在的视图,Laravel 会抛出错误,如果你想要包含一个有可能不存在的视图,可以使用 @includeIf 指令,如果包含的视图取决于一个给定的布尔条件,可以使用 @includeWhen 指令,与 @includeWhen 相对的指令是 @includeUnless,要包含给定数组中的存在的第一个视图,可以使用 @includeFirst 指令:

<div>
    @include('shared.errors')

    <form>
        @includeWhen($boolean, 'view.name', ['some' => 'data'])
        <!-- Form Contents -->
        @includeIf('view.name', ['some' => 'data'])
    </form>
    @include('view.name', ['some' => 'data'])
    <div>
        @includeFirst(['custom.admin', 'admin'], ['some' => 'data'])
    </div>
</div>

为包含视图设置别名

如果引入的子视图存放在某个子目录中,你可能希望为它们设置别名以便于访问。例如,假设 Blade 子视图存放在 resources/views/includes/input.blade.php 中,你可以使用 include 方法来为这个引入设置别名,将 includes.input 设置为 input,通常,该操作在 AppServiceProviderboot 方法中完成:

//AppServiceProvider中boot方法加入
Blade::include('includes.input', 'input');、
//blade模板中调用 可传递参数
@input(['type' => 'email'])

Blade 的 {{}} 语句已经经过 PHP 的 htmlentities 函数处理以避免 XSS 攻击。要想显示原生数据 {!! $name !!} 。渲染json内容@json($array)默认情况下,Blade(以及辅助函数 e)会对 HTML 实体进行双重编码。如果你想要禁止双重编码,可以在 AppServiceProviderboot 方法中调用 Blade::withoutDoubleEncoding() 方法:

由于很多 JavaScript 框架也是用花括号来表示要显示在浏览器中的表达式,如 Vue,我们可以使用 @ 符号来告诉 Blade 渲染引擎该表达式应该保持原生格式不作改动。或者使用@verbatim指令。比如:

<h1>Laravel</h1>
Hello, @{{ name }}.
@verbatim
    <div class="container">
        Hello, {{ name }}.
    </div>
@endverbatim

流程控住

# if语句
@if (count($records) === 1)
    I have one record!
@elseif (count($records) > 1)
    I have multiple records!
@else
    I don't have any records!
@endif

# unless语句
<!-- unless 相当于if not -->
@unless (Auth::check())
    You are not signed in.
@endunless

# isset语句
@isset($records)
    // $records is defined and is not null...
@endisset

#empty语句
@empty($records)
    // $records is "empty"...
@endempty

# auth验证 可以加守卫参数 @auth('admin')
@auth
    // 用户已登录...
@endauth

@guest
    // 用户未登录...
@endguest

# Section 指令 @hasSection 指令判断某个 section 中是否有内容:
@hasSection('navigation')
    <div class="pull-right">
        @yield('navigation')
    </div>

    <div class="clearfix"></div>
@endif

# sectionMissing 可用于判断某个 section 是否不包含内容:
@sectionMissing('navigation')
    <div class="pull-right">
        @include('default-navigation')
    </div>
@endif

# 环境指令 @production 指令检查应用是否在生产环境运行:
@production
    // Production specific content...
@endproduction

@env('staging')
    // 测试环境 "staging"...
@endenv

@env(['staging', 'production'])
    // 测试或者生产环境 "staging" or "production"...
@endenv

# switch 语句
@switch($i)
    @case(1)
        First case...
        @break

    @case(2)
        Second case...
        @break

    @default
        Default case...
@endswitch

# 循环语句
@for ($i = 0; $i < 10; $i++)
    The current value is {{ $i }}

@endfor

@foreach ($users as $user)
    <p>可在循环中加入 break continue </p>
    @break
    @continue

    @if ($user->type == 1)
        @continue
    @endif

    <p>This is user {{ $user->id }}</p>

    @if ($user->number == 5)
        @break
    @endif

    @continue($user->type == 1)
        <li>{{ $user->name }}</li>
    @break($user->number == 5)

@endforeach

@forelse ($users as $user)
    <li>{{ $user->name }}</li>
@empty
    <p>循环为空 no user</p>
@endforelse

@while (true)
    <p>I'm looping forever.</p>
@endwhile

# 循环中的 $loop 变量
@foreach ($users as $user)
    @foreach ($user->posts as $post)
        @if ($loop->parent->first)
            This is first iteration of the parent loop.
        @endif
    @endforeach
@endforeach

$loop 变量还提供了其他一些有用的属性:

属性 描述
$loop->index 当前循环迭代索引 (从0开始)
$loop->iteration 当前循环迭代 (从1开始)
$loop->remaining 当前循环剩余的迭代
$loop->count 迭代数组元素的总数量
$loop->first 是否是当前循环的第一个迭代
$loop->last 是否是当前循环的最后一个迭代
$loop->even 是否是当前循环的偶数迭代
$loop->odd 是否是当前循环的奇数迭代
$loop->depth 当前循环的嵌套层级
$loop->parent 嵌套循环中的父级循环变量

注释

Blade 还允许你在视图中定义注释,然而,不同于 HTML 注释,Blade 注释并不会包含到 HTML 中被返回:

{{-- This comment will not be present in the rendered HTML --}}

嵌入php代码

@php
    //
@endphp

小提示 now
头像
这里还没有评论,快评论吧。
头像

jiang

积土而为山,积水而为海。

Copyright © 2017-2020 嘉丽谷 版权所有