Laravel视图
# 快速入门
所有的视图文件存放在 resources/views
目录下。一个简单的视图文件如下:
<!-- 本段代码存储在 resources/views/welcome.blade.php -->
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>
2
3
4
5
6
7
然后使用全局辅助函数 view
将其返回:
Route::get('/', function(){
return view('welcome', ['name' => 'Mrcdh']);
});
2
3
# 创建 & 渲染视图
第一种方法,使用全局辅助函数 view
从应用程序的某个路由或控制器返回该视图。
Route::get('/', function(){
return view('welcome', ['name' => 'Mrcdh']);
});
2
3
第二种方法,使用 View
facade 返回视图:
use Illuminate\Support\Facades\View;
return View::make('welcome', ['name' => 'Mrcdh']);
2
3
第一个参数对应 resources/views
目录下的视图文件名。第二个参数是传递个视图的数组变量。
# 嵌套视图目录
使用 .
引用嵌套视图,如 resources/views/user/index.blade.php
:
return view('user.index', $data);
# 创建第一个可用的视图
使用 View
facade 的 first
方法,可以创建存在于给定视图数组中的第一个视图。
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
2
3
# 确定视图是否存在
如果需要判断视图文件是否存在,可以使用 View
facade。如果存在,exists
方法会返回 true
:
use Illuminate\Support\Facades\View;
if (View::exists('welcome') || view()->exists('welcome')) {
//
}
2
3
4
5
# 向视图传递数据
return view('greetings', ['name' => 'Victoria']);
return view('greeting')
->with('name', 'Victoria')
->with('occupation', 'Astronaut');
2
3
4
5
# 向所有视图共享数据
使用 View
facade 的 share
方法来向所有视图中共享一段数据。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
...
/**
* 引导应用服务
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
view()->share('key', 'value');
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 视图生成器
视图生成器是在呈现视图时调用的回调或类方法。
如果希望每次呈现视图时将数据自动绑定到视图中,则视图生成器可以帮助你将这些逻辑组织到一起。
如果应用程序中的多个路由或控制器返回同一个视图,并且始终需要特定的数据,那么视图生成器可能特别有用。
通常情况下,视图生成器在应用程序中的某个 服务提供者
里注册。
在本例中,我们将创建一个新的 App\Providers\ViewServiceProvider
来容纳本逻辑。
我们将使用 View
facade 的 composer
方法来注册视图生成器。Laravel 没有存放视图生成器的默认目录,所以你可以随意地组织它们。
举个例子,你可以创建一个 app/Http/View/Composers
目录来存放应用中的所有的视图生成器:
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 boot()
{
// 使用基于类的生成器
View::composer('profile', ProfileComposer::class);
// 使用基于闭包的生成器
View::composer('dashboard', function ($view) {
//
});
// 将视图生成器添加到多个视图
View::composer(
['profile', 'dashboard'],
ProfileComposer::class
);
// 使用 * 将生成器应用到所有视图
View::composer('*', function ($view) {
//
});
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
注意
记住,如果你创建了新的一个服务提供者来存放你注册视图生成器的代码,那么你需要将这个服务提供器添加到配置文件 config/app.php
的 providers
数组中。
现在我们注册了视图生成器,每次渲染 profile
视图的时候,都会执行 App\Http\View\Composers\ProfileComposer
类的 compose
方法。那么下面我们来定义视图生成器的这个类吧
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());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 视图创建器
视图创建器 creators
和视图生成器非常相似。唯一不同之处在于视图创建器在视图实例化之后执行,而视图合成器在视图即将渲染时执行。
使用 creator
方法注册视图创建器:
use App\Http\View\Creators\ProfileCreator;
use Illuminate\Support\Facades\View;
View::creator('profile', ProfileCreator::class);
2
3
4
# 视图优化
预编译视图
php artisan view:cache
清除视图缓存
php artisan view:clear