版本:Laravel 7.13.0

创建视图

视图包含应用程序的 HTML,并且将控制器 / 应用程序的逻辑与显示分开,视图文件存放与 resources/views 目录下。

创建一个简单的视图示例:

<!-- 此视图文件位置 resources/views/greeting.blade.php -->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>

该视图文件位于 resources/views/greeting.blade.php, 可以使用全局辅助函数 view 将其返回:

<!-- routes/web.php -->
Route::get('/', function () {
    return view('greeting', ['name' => 'James']);
});

递给 view 辅助函数的第一个参数对应 resources/views 目录中视图文件的名称。第二个参数是应该可供视图使用的数据数组。在这种情况下,我们传递 name 变量,该变量将使用 Blade模版的语法在视图中显示。

当然,视图文件也可以嵌套在 resources/views 目录的子目录中。「点」符号可以用来引用嵌套视图。例如,如果你的视图存储在 resources/views/admin/profile.blade.php,则可以这样引用它:

return view('admin.profile', $data);

注意:视图目录名中不应该包含 . 字符。

判断视图文件是否存在

如果需要判断视图文件是否存在,可以使用 View facade。如果存在,exists 方法会返回 true :

// 一般写在控制器中
use Illuminate\Support\Facades\View;

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

创建第一个可用视图

使用 first 方法,你可以创建存在于给定数组视图中的第一个视图。 如果你的应用程序或开发的第三方包允许定制或覆盖视图,这非常有用:

return view()->first(['custom.admin', 'admin'], $data);

当然,也可以通过 View facade 调用这个方法:

use Illuminate\Support\Facades\View;

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

向视图传递参数

可以将一组数据传递给视图:

return view('greetings', ['name' => 'Victoria']);

以这种方式传递信息时,数据应该是具有键 / 值对的数组。在视图中,可以使用相应的键访问每个值,例如 。作为将完整的数据数组传递给 view 辅助函数的替代方法,您可以使用 with 方法将数据添加到视图中,同样是以键值对的形式调用,例如下面的代码将 name 和 age 这两个变量的数据传递到 Blade 中。

return view('greeting')->with('name', 'Victoria');
// 如果有多个数据
return view('greeting')->with('name', 'Victoria')->with('age', 18);

视图共享数据

share 方法

定义一个所有视图都可以访问到的变量。
在服务提供器的 boot 方法中调用视图门面(Facade)的 share 方法。例如,可以将它们添加到 AppServiceProvider 或者为它们生成一个单独的服务提供器:

<!-- app/Providers/AppServiceProvider.php -->
// 在头部引入 View
use Illuminate\Support\Facades\View;

// 修改 boot 方法
public function boot()
{
    View::share('val', 'value');
}

接下来任何视图文件都可以使用 {{ $val }} 获取到 “value” 这个值,实现数据在所有视图间的共享。

视图合成器 composer 方法

视图合成器是在呈现视图前调用的回调方法或类方法,如果需要在每次呈现视图前将数据绑定到视图(比如用户登陆信息、每个视图中展示的侧边栏或者导航元素),则视图合成器可以帮助您将该逻辑组织到一个位置。

可以使用composer() 将逻辑组织到一个单独的地方。
本例中,我们将在AppServiceProvider服务提供器中注册视图合成器,
提供器代码如下:

<?php
namespace App\Providers;

#use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // 使用基于类方法
        // 第一个参数可以指定共享给那个视图,多个视图用数组,共享到全部视图可以用 *
        // 或者某个目录下所有视图 
        view()->composer(
            //'*', 'App\Http\ViewComposers\AuthComposer'
            //['extman.home, welcome'], 'App\Http\ViewComposers\AuthComposer'
            ['extman.*'], 'App\Http\ViewComposers\AuthComposer'
        );

        //使用基于回调函数
        view()->composer('*',function($view){
            $view->with('user',array('name'=>'test','avatar'=>'/path/to/test.jpg'));
        });
    }

}

如果创建一个新的服务提供器来包含视图 composer 注册,需要添加该服务提供者到配置文件 config/app.php 的 providers 数组中,下面假设注册的服务提供者类名为 ViewComposerServiceProvider

注册一个服务提供者,路径 app/Providers/ViewComposerServiceProvider.php

<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::composer(
            'pages/*', 'App\Http\View\Composers\NavigationComposer'
        );
    }
    /**
     * 注册服务提供者
     *
     * @return void
     */
    public function register()
    {
        // TODO: 实现 register() 方法。
    }
}

添加该服务提供者到配置文件 config/app.php 的 providers 数组中

<?php
return [
  'providers' => [
        // ....
        /*
         * 应用的服务提供者...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\ViewComposerServiceProvider::class,

        // ....
    ],
];

视图优化

默认情况下,视图是按需编译的。当执行渲染视图的请求时,Laravel 将确定该视图的编译版本是否存在。如果已编译视图存在,Laravel 将比较未编译试图是否已被修改。如果已编译视图不存在,或者未编译视图已被修改,Laravel 将重新编译该视图。

在请求期间编译视图会对性能产生影响,因此 Laravel 提供了 view:cache Artisan 命令来预编译应用中使用的所有视图文件。所以如果想提高网站性能,可以在部署过程中运行以下命令:

php artisan view:cache

view:clear 命令可以清除视图缓存:

php artisan view:clear