视图

创建 视图

技巧:如果你想找到有关如何编写 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 syntax在视图中显示。

当然,视图文件也可以嵌套在 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. }

创建第一个可用视图

使用 first 方法,你可以创建存在于给定数组视图中的第一个视图。 如果你的应用程序或开发的第三方包允许定制或覆盖视图,这非常有用:

  1. return view()->first(['custom.admin', 'admin'], $data);

当然,也可以通过 View facade 调用这个方法:

  1. use Illuminate\Support\Facades\View;
  2. return View::first(['custom.admin', 'admin'], $data);

向视图传递参数

正如在前面的示例中所看到的,可以将一组数据传递给视图:

  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 register()
  12. {
  13. //
  14. }
  15. /**
  16. * 引导任何应用服务
  17. *
  18. * @return void
  19. */
  20. public function boot()
  21. {
  22. View::share('key', 'value');
  23. }
  24. }

视图合成器

视图合成器是在呈现视图时调用的回调或类方法。如果每次呈现视图时都希望将数据绑定到视图,则视图合成器可以帮助您将该逻辑组织到一个位置。

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

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

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

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

  1. <?php
  2. namespace App\Http\View\Composers;
  3. use App\Repositories\UserRepository;
  4. use Illuminate\View\View;
  5. class ProfileComposer
  6. {
  7. /**
  8. * 实现 UserRepository
  9. *
  10. * @var UserRepository
  11. */
  12. protected $users;
  13. /**
  14. * 创建一个新的 profile 合成器
  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 方法将数据绑定到视图。

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

将视图合成器添加到多个视图

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

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

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

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

视图构造器

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

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

视图优化

默认情况下,视图是按需编译的。当执行渲染视图的请求时,Laravel 将确定该视图的编译版本是否存在。如果已编译视图存在,Laravel 将比较未编译试图是否已被修改。如果已编译视图不存在,或者未编译视图已被修改,Laravel 将重新编译该视图。

在请求期间编译视图会对性能产生影响,因此 Laravel 提供了 view:cache Artisan 命令来预编译应用中使用的所有视图文件。为了提高性能,你可能希望在部署过程中运行以下命令:

  1. php artisan view:cache

你可以使用 view:clear 命令清除视图缓存:

  1. php artisan view:clear

通常,可以假设视图将永远不会在生产环境中被修改。因此,可以通过修改 view 配置文件( config/view.php )中的 expires 选项来禁用 Laravel 检查视图文件是否过期:

  1. 'expires' => env('APP_ENV') !== 'production',

注意:您必须在部署过程中运行 php artisan view:cache 以禁用检查过期的视图。

本文章首发在 LearnKu.com 网站上。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接 我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

Laravel China 社区:https://learnku.com/docs/laravel/7.x/views/7464