创建视图
视图包含为应用服务的 HTML,并且把你的展示逻辑与你的控制器 / 应用逻辑分开。视图存放在 resources/views
文件夹。一个简单的视图看起来应该是下面这样:
<!-- View 存储在 resources/views/greeting.php --> <html> <body> <h1>Hello, {{ $name }}</h1> </body> </html>
由于视图存放在 resources/views/greeting.php
,你可以通过全局的 view
辅助函数这样返回它:
Route::get('/', function () { return view('greeting', ['name' => 'James']); });
你可以看到,传递给 view
辅助函数的第一个参数是相对于 resources/views
目录的文件名。第二个参数是需要传递给视图的数据数组。在这个例子中,我们传递一个 name
变量,它通过 Blade 语法展示在视图中。
当然,视图还可以嵌套存放在 resources/views
目录的子目录中。可以通过“点”语法来引用嵌套的视图。例如,如果你的视图存放在 resources/views/admin/profile.php
,你可以这样引用它:
return view('admin.profile', $data);
检查视图是否存在
如果你想判断视图是否存在,你可以使用 View
facade。如果存在,exists
方法将返回 true
:
use Illuminate\Support\Facades\View; if (View::exists('emails.customer')) { // }
向视图传递数据
在前面的例子你可以看到,可以向视图传送一个数组数据:
return view('greetings', ['name' => 'Victoria']);
当通过这种方式传递数据时,$data
应该是一个键值数据对数组。在视图中,你可以通过响应的键来获取值,例如 <?php echo $key; ?>
。传递完整的数组数据的另一种方式是通过 view
辅助函数,你可以通过 with
方法来向视图添加单独的数据:
return view('greeting')->with('name', 'Victoria');
推荐阅读:《向视图传送数据》
向所有视图共享数据
有时候,你可能需要在应用的所有视图中共享一些数据,你可以通过 View
facade 的 share
方法来实现。一般来说,你应该把所有的 share
调用都放到服务提供者的 boot
方法中。你可以根据意愿把它们添加到 AppServiceProvider
或生产一个单独的服务提供者来存放它们:
<?php namespace App\Providers; use Illuminate\Support\Facades\View; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { View::share('key', 'value'); } /** * Register the service provider. * * @return void */ public function register() { // } }
视图 Composer
视图 Composer 是 当视图渲染后执行的回调函数或类方法。如果你有些数据需要在试图每次渲染时都绑定到视图,视图 composer 可以帮你把这些逻辑组织到一个单独的位置。
在这个例子中,让我们在服务提供者中注册一个视图 composer。我们可以使用 View
facade 来访问 Illuminate\Contracts\View\Factory
contract 的底层实现。记住,Laravel 没有提供默认的文件夹来存放视图 composer。你可以根据意愿自由的组织它们。例如,你可以创建一个 App\Http\ViewComposers
文件夹:
<?php namespace App\Providers; use Illuminate\Support\Facades\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 ($view) { // }); } /** * Register the service provider. * * @return void */ public function register() { // } }
记住,如果你创建一个新的服务提供者来存放视图 composer 注册,你需要把这个服务提供者添加的 config/app.php
文件的 providers
数组中。
既然我们已经注册了这个 composer,那么每次 profile
视图渲染时都会执行 ProfileComposer@compose
方法。所以,我们来定义 Composer 类:
<?php namespace App\Http\ViewComposers; use Illuminate\View\View; use App\Repositories\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()); } }
视图渲染前会在 Illuminate\View\View
实例中调用 composer 的 compose
方法。你可以使用 with
方法来向视图绑定数据。
所有的视图 composer 都是通过服务容器获取的,因此,你可以在 composer 的构造函数中注入任何你需要的依赖。
向多个视图附加 composer
你可以通过向 composer
方法的第一个参数传递一个数组来一次向多个视图附加 composer:
View::composer( ['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer' );
composer
方法接收 *
作为通配符,允许你向所有视图附加 composer:
View::composer('*', function ($view) { // });
视图创建器
视图创建器同视图 composer 非常相似;然而,它会在视图实例化后立刻执行,而不会等到视图即将渲染时。要注册视图创建器,使用 creator
方法:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
该篇属于专题:《Laravel 5.3 中文文档》