基本用法
在视图里面包含了应用要提供的 HTML,它的主要的作用就是去把控制器还有 domain 逻辑跟展示的逻辑分离开。视图文件存储在 resources/views 这个目录里面。
resources/views ├── app.blade.php ├── auth │ ├── login.blade.php │ ├── password.blade.php │ ├── register.blade.php │ └── reset.blade.php ├── emails │ └── password.blade.php ├── errors │ └── 503.blade.php ├── home.blade.php ├── vendor └── welcome.blade.php 4 directories, 9 files
一个简单的视图看起来像这样:
<!-- View stored in resources/views/greeting.php -->
<html>
<body>
<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>
像这样为浏览器返回视图:
Route::get('/', function() { return view('greeting', ['name' => 'James']); });
你会看到,传递给 view 这个帮手方法的第一个参数就是视图文件的名字,这个文件是在 resources/views 目录的下面。传递的第二个参数是一个数据数组,这些数据可以在视图上使用。也就是在 greeting 这个视图上,可以输出 name 的值,也就是 James 。
视图可以嵌套在 resources/views 目录下面的子目录里。比如,你的视图是 resources/views/admin/profile.php,可以像这样返回:
return view('admin.profile', $data);
注意这个 admin.profile,admin 是目录的名字,点后面的 profile 是视图文件的名字。
给视图传递数据
// 使用传统的方法 $view = view('greeting')->with('name', 'Victoria'); // 使用魔术方法 $view = view('greeting')->withName('Victoria');
在上面的例子里,在视图上可以使用 $name 这个变量,它的值是 Victoria 。
你也可以把一个数据数组作为 view 帮手方法的第二个参数传递进去:
$view = view('greetings', $data);
在所有视图上共享数据
有时候,你可能需要在应用里的所有的视图上共享点数据。有几个选择: view 帮手方法,Illuminate\Contracts\Views\Factory Contract,或者一个 wildcard 视图 composer。
先看一下使用 view 帮手:
view()->share('data', [1, 2, 3]);
同样可以使用 view facade:
View::share('data', [1, 2, 3]);
一般来说,你要把 share 方法放到一个 Service Provider 的 boot 方法里面。可以把它们添加到 AppServiceProvider ,或者生成一个单独的 Service Provider 来存储它们。
注意:在调用 view 帮手方法的时候没有指定参数,它会返回一个实施的 Illuminate\Contracts\View\Factory Contract 。
确定视图是否存在
使用 exists 方法可以确定一个视图是否存在:
if (view()->exists('emails.customer'))
{
//
}
从文件路径返回视图
你可以从一个合格的文件路径上生成一个视图:
return view()->file($pathToFile, $data);
视图 Composers
视图 Composers 是在渲染视图的时候的回调函数或者类的方法,如果你有些数据,想在每次渲染视图的时候绑定到视图上,视图 Composer 可以把这些逻辑组织到一个地方。
定义视图 Composer
下面在一个 Service Provider 里面去组织一下视图 Composer。我们会用到 View facade 来访问,Illuminate\Contracts\View\Factory contact 实施:
<?php namespace App\Providers; use View; use Illuminate\Support\ServiceProvider; class ComposerServiceProvider extends ServiceProvider { /** * Register bindings in the container. * * @return void */ public function boot() { // Using class based composers... View::composer('profile', 'App\Http\ViewComposers\ProfileComposer'); // Using Closure based composers... View::composer('dashboard', function() { }); } }
注意:Laravel 里面没有为视图 Composers 准备默认的目录。你可以按自己的想法去组织。比如创建一个 App\Http\Composers 目录。
现在我们注册了 composer, 每次 profile 这个视图被渲染的时候,都会去执行 ProfileComposer@compose 这个方法,再去定义一下 composer 类:
<?php namespace App\Http\Composers; use Illuminate\Contracts\View\View; use Illuminate\Users\Repository as UserRepository; class ProfileComposer { /** * The user repository implementation. * * @var UserRepository */ protected $users; /** * Create a new profile composer. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { // Dependencies automatically resolved by service container... $this->users = $users; } /** * Bind data to the view. * * @param View $view * @return void */ public function compose(View $view) { $view->with('count', $this->users->count()); } }
在视图渲染之前,Composer 的 compose 方法被调用,带着 Illuminate\Contracts\View\View 实例。你可以使用 with 方法去把数据绑定到视图上。
注意:所有视图 composers 都是通过 service container 来 resolved,所以在 Composer 的构造函数里,你需要去 type-hint 任何你需要的依赖。
Wildcard 视图 Composers
composer 方法接受 * 号作为 wildcard,所以你可以把一个 composer 附加到所有的视图上:
View::composer('*', function()
{
//
});
把 Composer 附加到多个视图上
你同样可以一次把一个视图 Composer 附加到多个视图上:
View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer');
定义多个 Composers
使用 composers 方法可以去注册一个 composers 群组:
View::composers([ 'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'], 'App\Http\ViewComposers\UserComposer' => 'user', 'App\Http\ViewComposers\ProductComposer' => 'product' ]);
视图 Creators
视图 Creators 跟视图 Composers 用起来差不多,区别是,它们会在当视图被实例化以后立即执行。可以使用 creator 方法去注册一个视图 Creator:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');Laravel Laravel5 中文手册 视图 View