版本: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