# 视图
- [创建视图](#creating-views)
- [向视图传递数据](#passing-data-to-views)
- [与视图共享数据](#sharing-data-with-all-views)
- [视图合成器](#view-composers)
## 创建 视图
> {tip} 如果你想找到有关如何编写 Blade 模板的更多信息?从 查看完整的 [Blade 文档](/docs/{{version}}/blade) 入手。
视图包含应用程序的 HTML,并且将控制器 / 应用程序逻辑与演示逻辑分开。视图文件存放于`resources/views` 目录下。一个简单的视图如下所示:
Hello, {{ $name }}
该视图文件位于 `resources/views/greeting.blade.php`, 可以使用全局辅助函数 `view` 将其返回:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
如你所见, 传递给 `view` 辅助函数的第一个参数对应 `resources/views` 目录中视图文件的名称。第二个参数是应该可供视图使用的数据数组。在这种情况下,我们传递 `name`变量,该变量将使用 [Blade syntax](/docs/laravel/{{version}}/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](/docs/laravel/{{version}}/facades) 调用这个方法:
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
## 向视图传递参数
正如您在前面的示例中所看到的,您可以将一组数据传递给视图:
return view('greetings', ['name' => 'Victoria']);
以这种方式传递信息时,数据应该是具有键 / 值对的数组。在视图中,您可以使用相应的键访问每个值,例如 ``。 作为将完整的数据数组传递给 `view` 辅助函数的替代方法,您可以使用 `with` 方法将各个数据片段添加到视图中
return view('greeting')->with('name', 'Victoria');
#### 与所有视图共享数据
有时候,你可能需要共享一段数据给应用程序的所有视图。 你可以在服务提供器的 `boot` 方法中调用视图 Facade 的 `share` 方法。例如,可以将它们添加到 `AppServiceProvider` 或者为它们生成一个单独的服务提供器:
## 视图合成器
视图合成器是在呈现视图时调用的回调或类方法。 如果每次呈现视图时都希望将数据绑定到视图,则视图合成器可以帮助您将该逻辑组织到一个位置。
在下面这个例子中,我们会在一个 [服务提供商](/docs/{{version}}/providers) 中注册视图合成器。 使用 `View` facade 来访问底层的 `Illuminate\Contracts\View\Factory` 契约实现。默认情况下,Laravel 没有存放视图合成器的目录,你需要根据需求来重新建立目录,例如: `app/Http/View/Composers` :
注意:记住,如果你创建了新的一个服务提供器来存放你注册视图合成器的代码,那么你需要将这个服务提供器添加到配置文件 `config/app.php` 的 `providers` 数组中。
到此我们已经注册了视图合成器,每次渲染 `profile` 视图时都会执行 `ProfileComposer@compose` 方法。那么下面我们来定义视图合成器的这个类吧:
users = $users;
}
/**
* 将数据绑定到视图
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
视图合成器的 `compose` 方法会在视图渲染之前被调用,并传入一个 `Illuminate\View\View` 实例。你可以使用 `with` 方法将数据绑定到视图。
> 提示: 所有的视图合成器都会通过 [服务容器](/docs/{{version}}/container) , 进行解析,所以你可以在视图合成器的构造函数中类型提示需要注入的依赖项。
#### 将视图合成器添加到多个视图
通过将一组视图作为第一个参数传入 `composer` 方法,将一个视图合成器添加到多个视图:
View::composer(
['profile', 'dashboard'],
'App\Http\View\Composers\MyViewComposer'
);
`composer` 方法同时也接受通配符 `*` ,表示将一个视图合成器添加到所有视图:
View::composer('*', function ($view) {
//
});
#### 视图构造器
视图 **creators** 和视图合成器非常相似。唯一不同之处在于视图构造器在视图实例化之后立即执行,而视图合成器在视图即将渲染时执行。使用 `creator` 方法注册视图构造器:
View::creator('profile', 'App\Http\View\Creators\ProfileCreator');