当然,直接从您的路由和控制器返回整个 HTML 文档字符串是不切实际的。值得庆幸的是,视图提供了一种便捷的方式,可以将我们所有的 HTML 放到单独的文件中。
视图将你的控制器 / 应用逻辑与你的展示逻辑分离,并存储在 resources/views 目录中。当使用 Laravel 时,视图模板通常使用 Blade 模板语言 编写。一个简单的视图可能看起来像这样:
<!-- View stored in 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 文档 助您开始。
与其通过 Blade 用 PHP 编写前端模板,许多开发者已经开始倾向于使用 React 或 Vue 编写他们的模板。Laravel 让这变得轻松无痛,这得益于 Inertia,一个使得将你的 React / Vue 前端与你的 Laravel 后端连接起来变得轻而易举,且无需面对构建 SPA 的典型复杂性的库。
我们的 React 和 Vue 应用程序入门套件 为你下一个由 Inertia 驱动的 Laravel 应用程序提供了一个极佳的起点。
您可以通过将一个带有 .blade.php 扩展名的文件放置在您应用程序的 resources/views 目录中 或 使用 make:view Artisan 命令来创建视图:
php artisan make:view greeting该 .blade.php 扩展名通知框架该文件包含一个 Blade 模板。Blade 模板包含 HTML 以及 Blade 指令,这些指令允许你轻松地输出值、创建 "if" 语句、迭代数据等等。
创建视图后,您可以从应用程序的路由或控制器之一使用全局 view 辅助函数返回它:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});视图也可以使用 View 门面返回:
use Illuminate\Support\Facades\View;
return View::make('greeting', ['name' => 'James']);As you can see, the first argument passed to the view helper corresponds to the name of the view file in the resources/views directory. The second argument is an array of data that should be made available to the view. In this case, we are passing the name variable, which is displayed in the view using Blade syntax.
正如你所看到的,传递给 view 帮助函数的第一个参数对应于 resources/views 目录中视图文件的名称。第二个参数是一个数组,其中包含应提供给视图的数据。在此例子中,我们传递了 name 变量,该变量使用 Blade 语法 在视图中显示。
视图也可以嵌套在 resources/views 目录的子目录中。“点”表示法可以用于引用嵌套视图。例如,如果你的视图存储在 resources/views/admin/profile.blade.php,你可以从你的应用程序的路由/控制器之一像这样返回它:
return view('admin.profile', $data);[!WARNING]
视图目录名称不应包含.字符。
使用 View 门面的 first 方法,你可以创建存在于给定视图数组中的第一个视图。这可能很有用,如果你的应用或包允许视图被自定义或覆盖:
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);如果你需要判断视图是否存在,可以使用 View 外观。exists 方法在视图存在时会返回 true:
use Illuminate\Support\Facades\View;
if (View::exists('admin.profile')) {
// ...
}正如您在前面的示例中看到的,您可以将数据数组传递给视图,以使这些数据可供视图使用:
return view('greetings', ['name' => 'Victoria']);以这种方式传递信息时,数据应为包含键/值对的数组。将数据提供给视图后,你便可以在视图中访问每个值,使用数据的键,例如 <?php echo $name; ?>。
作为将完整数据数组传递给 view 辅助函数的一种替代方案,你可以使用 with 方法向视图添加单个数据片段。with 方法返回视图对象的一个实例,这样你就可以在返回视图之前继续链式调用方法:
return view('greeting')
->with('name', 'Victoria')
->with('occupation', 'Astronaut');有时,你可能需要与由你的应用程序渲染的所有视图共享数据。你可以使用 View 门面的 share 方法来做到这一点。通常,你应该将对 share 方法的调用放置在服务提供者的 boot 方法中。你可以将它们添加到 App\Providers\AppServiceProvider 类中,或生成一个单独的服务提供者来存放它们:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
// ...
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
View::share('key', 'value');
}
}视图合成器是在视图渲染时被调用的回调函数或类方法。如果你有数据希望每次视图渲染时都绑定到该视图,视图合成器可以帮助你将该逻辑组织到单一位置。如果你的应用程序中多个路由或控制器返回相同的视图并且该视图总是需要特定的数据,视图合成器可能会特别有用。
通常,视图合成器会注册在你的应用程序的服务提供者。 在本例中,我们将假定App\Providers\AppServiceProvider将承载此逻辑。
我们将使用 View 门面的 composer 方法来注册视图合成器。Laravel 不包含用于基于类的视图合成器的默认目录,因此您可以根据需要自由组织它们。例如,您可以创建一个 app/View/Composers 目录来存放您应用程序的所有视图合成器:
<?php
namespace App\Providers;
use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades;
use Illuminate\Support\ServiceProvider;
use Illuminate\View\View;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
// ...
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
// Using class-based composers...
Facades\View::composer('profile', ProfileComposer::class);
// Using closure-based composers...
Facades\View::composer('welcome', function (View $view) {
// ...
});
Facades\View::composer('dashboard', function (View $view) {
// ...
});
}
}现在我们已经注册了视图合成器,compose 方法的 App\View\Composers\ProfileComposer 类将在每次渲染 profile 视图时执行。让我们看一下合成器类的示例:
<?php
namespace App\View\Composers;
use App\Repositories\UserRepository;
use Illuminate\View\View;
class ProfileComposer
{
/**
* Create a new profile composer.
*/
public function __construct(
protected UserRepository $users,
) {}
/**
* Bind data to the view.
*/
public function compose(View $view): void
{
$view->with('count', $this->users->count());
}
}正如您所看到的,所有视图合成器都通过 服务容器 解析,因此您可以在合成器的构造函数中类型提示您需要的任何依赖项。
你可以通过将一个视图数组作为第一个参数传递给 composer 方法,从而同时将视图合成器附加到多个视图:
use App\Views\Composers\MultiComposer;
use Illuminate\Support\Facades\View;
View::composer(
['profile', 'dashboard'],
MultiComposer::class
);composer 方法也接受 * 字符作为通配符,允许你将一个合成器附加到所有视图:
use Illuminate\Support\Facades;
use Illuminate\View\View;
Facades\View::composer('*', function (View $view) {
// ...
});视图“创建器”与视图合成器非常相似;然而,它们会在视图被实例化之后立即执行,而不是等到视图即将渲染时。要注册一个视图创建器,使用 creator 方法:
use App\View\Creators\ProfileCreator;
use Illuminate\Support\Facades\View;
View::creator('profile', ProfileCreator::class);默认情况下,Blade 模板视图是按需编译的。当执行渲染视图的请求时,Laravel 将确定该视图的编译版本是否存在。如果文件存在,Laravel 将接着确定未编译视图是否比编译视图更新。如果编译视图不存在,或者未编译视图已被修改,Laravel 将重新编译该视图。
在请求期间编译视图可能会对性能产生轻微的负面影响,因此 Laravel 提供了 view:cache Artisan 命令来预编译你的应用所使用的所有视图。为了提升性能,你可能希望在部署过程中运行此命令:
php artisan view:cache您可以使用 view:clear 命令来清除视图缓存:
php artisan view:clear