Laravel 文档阅读:视图

翻译、衍生自:https://learnku.com/docs/laravel/5.5/views

创建视图

视图将业务逻辑和表现层分离。视图文件位于 resources/views 目录下。一个简单的视图文件看起来是这样的:

<!-- View stored in resources/views/greeting.blade.php -->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>

我们可以用全局 view 辅助函数返回这个视图:

Route::get('/', function () {
    return view('greeting', ['name' => 'James']);
});

传递给 view 函数的第一个参数是视图文件的路径,这个路径是相对于 resources/views 这个目录的;第二个参数是传递给视图文件的数据,是一个数组,数组里的数据可在视图文件中取得。在上面的例子里,我们给 greeting.blade.php 这个视图文件传递了一个 name 变量,在 Blade 模板里使用 {{ }} 符号解析、显示了这个变量值。

当然,如果视图文件是保存在 resources/views 这个目录下的子目录里的,我们就要用点(.)符号引用视图了。例如,如果视图文件地址是 resources/views/admin/profile.blade.php,你就要这样引用它。

return view('admin.profile', $data);

判断视图是否存在

使用 View 门面的 exists 方法,判断视图文件是否存在。该方法返回一个布尔值,true 表示文件存在,false 表示文件不存在。

use Illuminate\Support\Facades\View;

if (View::exists('emails.customer')) {
    //
}

返回第一个可用视图

使用 first 方法,返回给定的数组列表里,第一个可用的视图文件。这对于要自定义
或重写视图文件的应用程序和包非常有用:

return view()->first(['custom.admin', 'admin'], $data);

当然,也可以通过 View 门面调用这个方法:

use Illuminate\Support\Facades\View;

return View::first(['custom.admin', 'admin'], $data);

向视图传递数据

之前的例子中已经演示过,你可以以数组的形式向视图传递数据:

return view('greetings', ['name' => '维多利亚']);

以这种方式传递的数据,都是键值对的形式。在视图文件里,使用键来获得对应的值,比如:<?php echo $key; ?>。如果传递给视图的只有一条数据,那么使用 view 辅助函数上的 with 方法吧!

return view('greeting')->with('name', 'Victoria');

视图共享数据

偶尔,所有视图里可能都使用了同样的一些数据,我们称这些数据是「视图共享数据」。共享数据使用的是 View::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()
    {
        //
    }
}

视图 Composers

「视图 Composers」这个名字听起来很酷炫,但是必须要解释一番才知道意思。

视图 Composers 是在视图渲染时,调用的一个回调函数或者类方法(没错,就干这个的)。你可能会在视图渲染、并为视图绑定数据时用到它,一个视图 Composer 能把这些视图渲染时,做的绑定逻辑维护在一个地方。

我们在服务提供者中注册视图 Composer。我们使用 View 门面访问底层 Illuminate\Contracts\View\Factory 契约实现。记住,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 方法。

<?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) {
    //
});

视图 Creators

视图 Creator 和视图 Composer 几乎是一样的,只是调用时机不同。视图 Creator 是在视图实例化后立即执行的,视图 Composer 是在视图即将渲染时执行的。注册一个视图 Creator,使用 creator 方法:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!