视图

视图的用途是用来存放应用程序中 HTML 内容,并且能够将你的控制器层(或应用逻辑层)与展现层分开。视图文件目录为 ,示例视图如下:

上述视图文件位置为 resources/views/greeting.php ,我们可以通过全局函数 view 来使用这个视图,如下:

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

如你所见,view 函数中,第一个参数即 resources/views 目录中视图文件的文件名,第二个参数是一个数组,数组中的数据可以直接在视图文件中使用。在上面示例中,我们将 name 变量传递到了视图中,并在视图中使用 Blade 模板语言 打印出来。

当然,视图文件也可能存放在 resources/views 的子目录中,你可以使用英文句点 . 来引用深层子目录中的视图文件。例如,一个视图的位置为 resources/views/admin/profile.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('greeting')->with('name', 'Victoria');

把数据共享给所有视图

有时候可能需要共享特定的数据给应用程序中所有的视图,那这时候你需要 View Facade 的 share 方法。通常需要将所有 share 方法的调用代码放到 的 boot 方法中,此时你可以选择使用 AppServiceProvider 或创建独立的 服务提供者 。示例代码如下:

  1. <?php
  2. namespace App\Providers;
  3. use Illuminate\Support\Facades\View;
  4. class AppServiceProvider extends ServiceProvider
  5. {
  6. *
  7. * @return void
  8. */
  9. public function boot()
  10. {
  11. View::share('key', 'value');
  12. }
  13. /**
  14. * Register the service provider.
  15. *
  16. * @return void
  17. */
  18. public function register()
  19. {
  20. //
  21. }
  22. }

视图合成器是在视图渲染时调用的一些回调或者类方法。如果你需要在某些视图渲染时绑定一些数据上去,那么视图合成器就是你的的不二之选,另外他还可以帮你将这些绑定逻辑整理到特定的位置。

下面例子中,我们会在一个 服务提供者 中注册一些视图合成器。同时使用 View Facade 来访问 Illuminate\Contracts\View\Factory contract 的底层实现。注意: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. * Register bindings in the container.
  9. *
  10. * @return void
  11. public function boot()
  12. {
  13. View::composer(
  14. 'profile', 'App\Http\ViewComposers\ProfileComposer'
  15. );
  16. // Using Closure based composers...
  17. View::composer('dashboard', function ($view) {
  18. //
  19. });
  20. }
  21. /**
  22. * Register the service provider.
  23. *
  24. * @return void
  25. */
  26. public function register()
  27. {
  28. //
  29. }
  30. }

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

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

通过将目标视图文件数组作为第一个参数传入 composer 方法,你可以把一个视图合成器同时附加到多个视图。

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

composer 方法同时也接受通配符 * ,可以让你将一个视图合成器一次性绑定到所有的视图:

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

视图塑造器

视图 塑造器 和视图合成器非常相似。不同之处在于:视图塑造器在视图实例化时执行,而视图合成器在视图渲染时执行。如下,可以使用 creator 方法来注册一个视图塑造器: