Laravel 视图

创建视图

视图包含应用程序提供的HTML,它将逻辑控制和页面展示进行分离。视图存储在resources/views目录中。一个简单的视图可能看起来像这样:

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

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

因为该视图是存储在resources/views/greeting.blade.php模版文件中,所以我们可以使用view帮助函数将其返回,如下所示:

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

正如我们所见的,传递给view帮助函数的第一个参数与resources/views目录中视图文件的名称相对应。第二个参数是应提供给视图的数据数组。在这种情况下,我们将传递name变量,该变量将使用Blade语法显示在视图中。

视图也可以嵌套在resources/views目录的子目录中。“.”符号可用于引用嵌套视图。例如,如果我们的视图存储在resources/views/admin/profile.blade.php文件中,则可以这样引用:

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

查看目录名称中不应包含该.字符。

检查给定的视图是否存在

如果需要确定指定的视图是否存在,则可以使用View Facadeexists方法。如果该视图存在,则exists方法将返回true:

use Illuminate\Support\Facades\View;

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

创建第一个可用视图

使用first方法,我们可以创建存在于给定视图数组中的第一个视图。如果应用程序或程序包允许自定义或覆盖视图,这将非常有用:

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

我们也可以通过View Facade调用此方法:

use Illuminate\Support\Facades\View;

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

将数据传递到视图

如前面的示例所示,我们可以将数组传递给视图:

return view('greetings', ['name' => 'Victoria']);

以这种方式传递数据时,数据应为具有键/值对的数组。然后,就可以在视图内部使用其对应的键(例如)<?php echo $key; ?>。除了使用view的第二个参数传一个完整的数组方式之外,还可以使用with方法将单个数据段添加到视图中:

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

与所有视图共享数据

有时,我们可能需要与应用程序呈现的所有视图共享一条数据。可以使用View Facade的share方法来执行此操作。通常,share在Service Provider的boot方法内进行调用。我们可以将它们在AppServiceProvider中调用,也可以生成单独的Service Provider来执行它们:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }
}

View Composer

view composer是在呈现视图时调用的回调方法或某个类的方法。如果想要在每次渲染视图时将数据绑定到视图,view composer可以实现这个逻辑。

在下面示例中,我们在Service Provider内部注册view composer。我们将使用View Facade访问底层的Illuminate\Contracts\View\Factory接口实现。请记住,Laravel不包括view composers的默认目录。我们可以随意组织它们。例如,我们可以创建一个app/Http/View/Composers目录:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        View::composer(
            'profile', 'App\Http\View\Composers\ProfileComposer'
        );

        // Using Closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }
}

请记住,如果我们创建一个新的service provider 用来注册一个view composer,则需要将service provider 添加到配置文件config/app.php中的providers数组中。

现在我们已经注册了composer,ProfileComposer@compose方法将在每次profile渲染视图时执行。因此,让我们定义composer类:

<?php

namespace App\Http\View\Composers;

use App\Repositories\UserRepository;
use Illuminate\View\View;

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());
    }
}

就在呈现视图之前,compose方法已经由Illuminate\View\View实例调用了。我们可以使用with方法将数据绑定到视图。

所有视图composer都通过service container 解析,因此我们可以加入类型限定,以了解编写器的构造函数中需要的任何依赖项。

将Composer附加到多个视图

我们可以通过将视图数组作为该composer方法的第一个参数传递,将视图composer一次附加到多个视图:

View::composer(
    ['profile', 'dashboard'],
    'App\Http\View\Composers\MyViewComposer'
);

composer方法还支持通配符*,从而使我们可以将composer附加到所有视图:

View::composer('*', function ($view) {
    //
});

视图 creator

视图creator与视图composer非常相似。不同的是creators在视图实例化立即执行,而不是等到视图将要渲染时才执行。要注册视图creator,请使用creator方法:

View::creator('profile', 'App\Http\View\Creators\ProfileCreator');

优化视图

默认情况下,视图是按需编译的。当执行渲染视图的请求时,Laravel将确定该视图的编译版本是否存在。如果文件存在,Laravel将确定未编译视图是否被更新。如果已编译视图不存在,或者未编译视图已被修改,Laravel将重新编译该视图。

在请求期间编译视图会对性能产生负面影响,因此Laravel提供了view:cache命令来预编译应用程序使用的所有视图。为了提高性能,我们可能希望在部署过程中运行以下命令:

$ php artisan view:cache

我们可以使用view:clear命令清除视图缓存:

$ php artisan view:clear

查看笔记

扫码一下
查看教程更方便