• Laravel 的视图
    • 创建视图
      • 判断视图文件是否存在
  • 向视图传递数据
    • 与所有视图共享数据
  • 视图合成器
    • 将视图构造器添加到多个视图
    • 视图构造器
  • 译者署名

    Laravel 的视图

    • 创建视图
    • 向视图传递数据
      • 与所有视图共享数据
    • 视图合成器

    创建视图

    {tip} 想寻找有关如何编写 Blade 模板的更多信息?查看完整的 Blade 文档。

    视图包含应用程序的 HTML,并且将控制器/应用程序逻辑与演示逻辑分开。视图文件存放于 resources/views 目录下。一个简单的视图如下所示:

    1. <!-- 此视图文件位置:resources/views/greeting.blade.php -->
    2. <html>
    3. <body>
    4. <h1>Hello, {{ $name }}</h1>
    5. </body>
    6. </html>

    该视图文件位于 resources/views/greeting.blade.php,使用全局辅助函数 view 来返回:

    1. Route::get('/', function () {
    2. return view('greeting', ['name' => 'James']);
    3. });

    如你所见,view 函数中,传入的第一个参数对应着 resources/views 目录中视图文件的名称,第二个参数是可在视图文件中使用的数据数组。在示例中,我们传递 name 变量,该变量可以使用 Blade 模板语言 在视图中显示。

    当然,视图文件也可以嵌套在 resources/views 目录的子目录中。「点」符号可以用来引用嵌套视图。例如,如果你的视图存储在 resources/views/admin/profile.blade.php,则可以这样引用它:

    1. return view('admin.profile', $data);

    判断视图文件是否存在

    如果需要判断视图文件是否存在,可以使用 View Facade 上的 exists 方法。如果视图文件存在,该方法会返回 true

    1. use Illuminate\Support\Facades\View;
    2. if (View::exists('emails.customer')) {
    3. //
    4. }

    向视图传递数据

    如上述例子所示,你可以使用数组将数据传递到视图:

    1. return view('greetings', ['name' => 'Victoria']);

    当用这种方式传递数据时,作为第二个参数的数据必须是键值对数组。在视图文件中,你可以通过对应的键获取相应的值,例如 <?php echo $key; ?>。作为将完整数据传递给辅助函数 view 的替代方法,你可以使用 with 方法将单个数据片段添加到视图:

    1. return view('greeting')->with('name', 'Victoria');

    与所有视图共享数据

    如果需要共享一段数据给应用程序的所有视图,你可以在服务提供器的 boot 方法中调用视图 Facade 的 share 方法。例如,可以将它们添加到 AppServiceProvider 或者为它们生成一个单独的服务提供器:

    1. <?php
    2. namespace App\Providers;
    3. use Illuminate\Support\Facades\View;
    4. class AppServiceProvider extends ServiceProvider
    5. {
    6. /**
    7. * 引导任何应用服务。
    8. *
    9. * @return void
    10. */
    11. public function boot()
    12. {
    13. View::share('key', 'value');
    14. }
    15. /**
    16. * 注册服务提供器
    17. *
    18. * @return void
    19. */
    20. public function register()
    21. {
    22. //
    23. }
    24. }

    视图合成器

    视图合成器是在渲染视图时调用的回调或者类方法。如果你每次渲染视图时都要绑定视图的数据,视图合成器可以帮你将这些逻辑整理到特定的位置。

    在下面这个例子中,我们会在一个 服务提供器 中注册视图合成器,使用 View Facade 来访问底层的 Illuminate\Contracts\View\Factory 契约实现。默认情况下,Laravel 没有存放视图合成器的目录,你需要根据喜好来重新建立目录,例如:App\Http\ViewComposers

    1. <?php
    2. namespace App\Providers;
    3. use Illuminate\Support\Facades\View;
    4. use Illuminate\Support\ServiceProvider;
    5. class ComposerServiceProvider extends ServiceProvider
    6. {
    7. /**
    8. * 在容器中注册绑定
    9. *
    10. * @return void
    11. */
    12. public function boot()
    13. {
    14. // 使用基于类的 composer...
    15. View::composer(
    16. 'profile', 'App\Http\ViewComposers\ProfileComposer'
    17. );
    18. // 使用基于闭包的 composers...
    19. View::composer('dashboard', function ($view) {
    20. //
    21. });
    22. }
    23. /**
    24. * 注册服务器提供者
    25. *
    26. * @return void
    27. */
    28. public function register()
    29. {
    30. //
    31. }
    32. }

    {note} 注意,如果你创建了新的一个服务提供器来存放你注册视图合成器的代码,那么你需要将这个服务提供器添加到配置文件 config/app.phpproviders 数组中。

    到此我们已经注册了视图合成器,每次渲染 profile 视图时都会执行 ProfileComposer@compose 方法。那么下面我们来定义视图合成器的这个类吧:

    1. <?php
    2. namespace App\Http\ViewComposers;
    3. use Illuminate\View\View;
    4. use App\Repositories\UserRepository;
    5. class ProfileComposer
    6. {
    7. /**
    8. * 用户 repository 实现
    9. *
    10. * @var UserRepository
    11. */
    12. protected $users;
    13. /**
    14. * 创建一个新的 profile composer
    15. *
    16. * @param UserRepository $users
    17. * @return void
    18. */
    19. public function __construct(UserRepository $users)
    20. {
    21. // 依赖关系由服务容器自动解析...
    22. $this->users = $users;
    23. }
    24. /**
    25. * 将数据绑定到视图。
    26. *
    27. * @param View $view
    28. * @return void
    29. */
    30. public function compose(View $view)
    31. {
    32. $view->with('count', $this->users->count());
    33. }
    34. }

    视图合成器的 compose 方法会在视图渲染之前被调用,并传入一个 Illuminate\View\View 实例。你可以使用 with 方法将数据绑定到视图。

    {tip} 所有的视图合成器都会通过 服务容器 进行解析,所以你可以在视图合成器的构造函数中类型提示需要注入的依赖项。

    将视图构造器添加到多个视图

    通过将一组视图作为第一个参数传入 composer 方法,将一个视图合成器添加到多个视图:

    1. View::composer(
    2. ['profile', 'dashboard'],
    3. 'App\Http\ViewComposers\MyViewComposer'
    4. );

    composer 方法同时也接受通配符 *,表示将一个视图合成器添加到所有视图:

    1. View::composer('*', function ($view) {
    2. //
    3. });

    视图构造器

    视图构造器和视图合成器非常相似。唯一不同之处在于:视图构造器在视图实例化之后立即执行,而视图合成器在视图即将渲染时执行。使用 creator 方法注册视图构造器:

    1. View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');

    译者署名

    用户名 头像 职能 签名
    @JokerLinly Laravel 的视图 - 图1 Review Stay Hungry. Stay Foolish.
    @shamiao Laravel 的视图 - 图2 修正 Make developers great again.

    {note} 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。

    转载请注明:本文档由 Laravel China 社区 laravel-china.org 组织翻译,详见 翻译召集帖。

    文档永久地址: https://d.laravel-china.org