首页 » Laravel 5.3 中文文档 » 正文

「Laravel 5.3 中文文档」视图 & 模板 – 视图

创建视图

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

发表评论