版本: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 IlluminateSupportFacadesView; if (View::exists('emails.customer')) { // }
创建第一个可用视图
使用 first
方法,你可以创建存在于给定数组视图中的第一个视图。 如果你的应用程序或开发的第三方包允许定制或覆盖视图,这非常有用:
return view()->first(['custom.admin', 'admin'], $data);
当然,也可以通过 View
facade 调用这个方法:
use IlluminateSupportFacadesView; 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 IlluminateSupportFacadesView; // 修改 boot 方法 public function boot() { View::share('val', 'value'); }
接下来任何视图文件都可以使用 {{ $val }} 获取到 “value” 这个值,实现数据在所有视图间的共享。
视图合成器 composer 方法
视图合成器是在呈现视图前调用的回调方法或类方法,如果需要在每次呈现视图前将数据绑定到视图(比如用户登陆信息、每个视图中展示的侧边栏或者导航元素),则视图合成器可以帮助您将该逻辑组织到一个位置。
可以使用composer()
将逻辑组织到一个单独的地方。
本例中,我们将在AppServiceProvider
服务提供器中注册视图合成器,
提供器代码如下:
<?php namespace AppProviders; #use IlluminateSupportFacadesView; use IlluminateSupportServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { // 使用基于类方法 // 第一个参数可以指定共享给那个视图,多个视图用数组,共享到全部视图可以用 * // 或者某个目录下所有视图 view()->composer( //'*', 'AppHttpViewComposersAuthComposer' //['extman.home, welcome'], 'AppHttpViewComposersAuthComposer' ['extman.*'], 'AppHttpViewComposersAuthComposer' ); //使用基于回调函数 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 AppProviders; use IlluminateSupportFacadesView; use IlluminateSupportServiceProvider; class ViewComposerServiceProvider extends ServiceProvider { public function boot() { View::composer( 'pages/*', 'AppHttpViewComposersNavigationComposer' ); } /** * 注册服务提供者 * * @return void */ public function register() { // TODO: 实现 register() 方法。 } }
添加该服务提供者到配置文件 config/app.php 的 providers 数组中
<?php return [ 'providers' => [ // .... /* * 应用的服务提供者... */ AppProvidersAppServiceProvider::class, AppProvidersAuthServiceProvider::class, AppProvidersEventServiceProvider::class, AppProvidersRouteServiceProvider::class, AppProvidersViewComposerServiceProvider::class, // .... ], ];
视图优化
默认情况下,视图是按需编译的。当执行渲染视图的请求时,Laravel 将确定该视图的编译版本是否存在。如果已编译视图存在,Laravel 将比较未编译试图是否已被修改。如果已编译视图不存在,或者未编译视图已被修改,Laravel 将重新编译该视图。
在请求期间编译视图会对性能产生影响,因此 Laravel 提供了 view:cache Artisan 命令来预编译应用中使用的所有视图文件。所以如果想提高网站性能,可以在部署过程中运行以下命令:
php artisan view:cache
view:clear 命令可以清除视图缓存:
php artisan view:clear