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 Facade
的exists
方法。如果该视图存在,则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