创建视图
视图包含为应用服务的 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 中文文档》