视图
视图
介绍
当然,直接从路由和控制器返回整个 HTML 文档字符串是不实际的。谢天谢地,视图提供了一种方便的方法,可以将所有的 HTML 放在不同的文件中。视图将控制器 / 应用逻辑与显示逻辑分开,并存储在 resources/views
目录下。一个简单的视图如下所示:
<!-- 本段代码存储在 resources/views/greeting.blade.php -->
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>
将上述代码存储在 resources/views/greeting.blade.php
后,我们可以使用全局辅助函数 view
将其返回,如下所示:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
技巧:寻找有关如何 Blade 模板的更多信息?查看完整的 Blade 文档。
创建 & 渲染视图
你可以在应用的 resources/views
目录中,通过创建一个带有 .blade.php
扩展名的文件来创建视图。如果文件带有 .blade.php
扩展名,则会通知框架其包含一个 Blade 模板。Blade 模板包含 HTML 和 Blade 指令,可以让你轻松显示数值,创建 if 语句,迭代数据等等。
创建视图后,可以使用全局辅助函数 view
从应用程序的某个路由或控制器返回该视图:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
也可以使用 View
facade 返回视图:
use Illuminate\Support\Facades\View;
return View::make('greeting', ['name' => 'James']);
如你所见,辅助函数 view
第一个参数对应 resources/views
目录下的视图文件名。第二个参数是传递给视图的数据数组。在本例中,我们传递的是 name
变量,该变量使用 Blade 语法 展示在视图中。
嵌套视图目录
视图也可以嵌套在 resources/views
目录的子目录中。.
符号可用于引用嵌套视图。例如,如果你的视图存放在 resources/views/admin/profile.blade.php
,你可以在应用的路由或者控制器中使用如下所示方法返回视图:
return view('admin.profile', $data);
注意:视图目录名称中不能包含
.
字符。
创建第一个可用视图
使用 View
facade 的 first
方法,可以创建存在于给定视图数组中的第一个视图。如果应用程序或者包允许自定义或覆盖视图,这可能对你有点帮助:
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
确定视图是否存在
如果需要判断视图文件是否存在,可以使用 View
facade。如果存在,exists
方法会返回 true
:
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
向视图传递数据
正如在前面的示例中所看到的,可以将一组数据传递给视图:
return view('greetings', ['name' => 'Victoria']);
以这种方式传递信息时,数据应该是具有键 / 值对的数组。在视图中,可以使用相应的键访问每个值,例如 <?php echo $name; ?>
。
作为将完整的数据数组传递给 view
辅助函数的替代方法,可以使用 with
方法将各个数据片段添加到视图中:
return view('greeting')
->with('name', 'Victoria')
->with('occupation', 'Astronaut');
向所有视图分享数据
有时候,你可能需要共享一段数据给应用程序的所有视图。你可以使用 View
facade 的 share
方法来实现。通常情况下,你可以在服务提供器的 boot
方法中调用 share
方法。你可以把他们添加到 App\Providers\AppServiceProvider
类,或者为它们生成一个单独的服务提供器:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* 注册应用服务
*
* @return void
*/
public function register()
{
//
}
/**
* 引导应用服务
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
}
视图生成器
视图生成器是在呈现视图时调用的回调或类方法。如果希望每次呈现视图时将数据自动绑定到视图中,则视图生成器可以帮助你将这些逻辑组织到一起。如果应用程序中的多个路由或控制器返回同一个视图,并且始终需要特定的数据,那么视图生成器可能特别有用。
通常情况下,视图生成器在应用程序中的某个 服务提供者 里注册。在本例中,我们将创建一个新的 App\Providers\ViewServiceProvider
来容纳本逻辑。
我们将使用 View
facade 的 composer
方法来注册视图生成器。Laravel 没有存放视图生成器的默认目录,所以你可以随意地组织它们。举个例子,你可以创建一个 app/Http/View/Composers
目录来存放应用中的所有的视图生成器:
<?php
namespace App\Providers;
use App\Http\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
/**
* 注册应用服务
*
* @return void
*/
public function register()
{
//
}
/**
* 引导应用服务
*
* @return void
*/
public function boot()
{
// 使用基于类的生成器
View::composer('profile', ProfileComposer::class);
// 使用基于闭包的生成器
View::composer('dashboard', function ($view) {
//
});
}
}
注意:记住,如果你创建了新的一个服务提供者来存放你注册视图生成器的代码,那么你需要将这个服务提供器添加到配置文件
config/app.php
的providers
数组中。
现在我们注册了视图生成器,每次渲染 profile
视图的时候,都会执行 App\Http\View\Composers\ProfileComposer
类的 compose
方法。那么下面我们来定义视图生成器的这个类吧:
<?php
namespace App\Http\View\Composers;
use App\Repositories\UserRepository;
use Illuminate\View\View;
class ProfileComposer
{
/**
* 用户库的实现
*
* @var \App\Repositories\UserRepository
*/
protected $users;
/**
* 创建一个 profile 视图生成器
*
* @param \App\Repositories\UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// 依赖项由服务容器自动解析...
$this->users = $users;
}
/**
* 绑定视图数据
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
如你所见,所有视图生成器都是通过 服务容器 解析的,因此你可以在生成器的构造函数中引入所需的任何依赖项。
将视图生成器添加到多个视图
通过将一组视图作为第一个参数传入 composer
方法,可以一次添加多个视图到视图合成器中:
use App\Http\Views\Composers\MultiComposer;
View::composer(
['profile', 'dashboard'],
MultiComposer::class
);
composer
方法还接受 *
作为通配符,允许你将生成器附加到所有视图中:
View::composer('*', function ($view) {
//
});
视图创建器
视图创建器「creators」和视图生成器非常相似。唯一不同之处在于视图创建器在视图实例化之后执行,而视图合成器在视图即将渲染时执行。使用 creator
方法注册视图创建器:
use App\Http\View\Creators\ProfileCreator;
use Illuminate\Support\Facades\View;
View::creator('profile', ProfileCreator::class);
视图优化
默认情况下,视图是按需编译的。当执行渲染视图的请求时,Laravel 将确定该视图的编译版本是否存在。如果已编译视图存在,Laravel 将比较未编译视图是否已被修改。如果已编译视图不存在,或者未编译视图已被修改,Laravel 将重新编译该视图。
在请求期间编译视图会对性能产生影响,因此 Laravel 提供了 view:cache
Artisan 命令来预编译应用中使用的所有视图文件。为了提高性能,你可能希望在部署过程中运行以下命令:
php artisan view:cache
你可以使用 view:clear
命令清除视图缓存:
php artisan view:clear