创建视图
技巧:如果您想了解更多关于如何编写 Blade 模板的更多信息?查看完整的 Blade 文档 将是最好的开始。
视图包含应用程序的 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 syntax 在视图中显示。
当然,视图文件也可以嵌套在 resources/views
目录的子目录中。「点」符号可以用来引用嵌套视图。例如,如果你的视图存储在 resources/views/admin/profile.blade.php
,则可以这样引用它:
return view('admin.profile', $data);
注意:视图目录名中不应该包含
.
字符。
判断视图文件是否存在
如果需要判断视图文件是否存在,可以使用 View
facade。如果存在,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');
与所有视图共享数据
有时候,你可能需要共享一段数据给应用程序的所有视图。 你可以在服务提供器的 boot
方法中调用视图门面(Facade)的 share
方法。例如,可以将它们添加到 AppServiceProvider
或者为它们生成一个单独的服务提供器:
<?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');
}
}
视图合成器
视图合成器是在呈现视图时调用的回调或类方法。如果希望每次呈现视图时将数据自动绑定到视图中,则视图合成器可以帮助您将这些逻辑组织到一起:
默认情况下,Laravel
没有存放视图合成器的目录,您可以根据需要来重新建立目录。例如: app/Http/View/Composers
。在下面这个例子中,我们会在一个 service provider 中注册视图合成器。 使用 View
门面(Facade)来实现访问底层的 Illuminate\Contracts\View\Factory
契约:
<?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) {
//
});
}
}
注意:记住,如果你创建了新的一个服务提供者来存放你注册视图合成器的代码,那么你需要将这个服务提供器添加到配置文件
config/app.php
的providers
数组中。
现在我们注册了视图合成器,每次渲染 profile
视图时都会执行 ProfileComposer@compose
方法。那么下面我们来定义视图合成器的这个类吧:
<?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
方法,可以一次添加多个视图到视图合成器中:
View::composer(
['profile', 'dashboard'],
'App\Http\View\Composers\MyViewComposer'
);
composer
方法同时也接受通配符 *
,表示将所有视图添加到视图合成器中:
View::composer('*', function ($view) {
//
});
视图构造器
视图构造器(creators)和视图合成器非常相似。唯一不同之处在于视图构造器在视图实例化之后执行,而视图合成器在视图即将渲染时执行。使用 creator
方法注册视图构造器:
View::creator('profile', 'App\Http\View\Creators\ProfileCreator');
视图优化
默认情况下,视图是按需编译的。当执行渲染视图的请求时,Laravel 将确定该视图的编译版本是否存在。如果已编译视图存在,Laravel 将比较未编译视图是否已被修改。如果已编译视图不存在,或者未编译视图已被修改,Laravel 将重新编译该视图。
在请求期间编译视图会对性能产生影响,因此 Laravel 提供了 view:cache
Artisan 命令来预编译应用中使用的所有视图文件。为了提高性能,你可能希望在部署过程中运行以下命令:
php artisan view:cache
你可以使用 view:clear
命令清除视图缓存:
php artisan view:clear
猜你喜欢: