🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余10个优惠名额) →

Laravel 5 中文手册(八):视图 Views

基本用法

在视图里面包含了应用要提供的 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
微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点