简介
- 为了增强解视图代码的可维护性,我们除了要了解视图最基础的使用方式,还要对视图的共享数据方式做深入的了解,本文将介绍Laravel视图数据共享的常用方法。
通过 ServiceProvider “注册服务提供者”共享view数据
通过
ServiceProvider
来完成视图数据的共享是一种比较常用的方式之一。用到
Illuminate\Support\Facades\View::share('key', 'value');
-
接下来做一个完整的举例,首先生成一个 ServiceProvider 通过
php artisan make:provider TestShareViewProvider
命令创建一个Provider 的模板。
打开
app/Providers/TestShareViewProvider.php
我们只是修改boot() 方法即可,因为,此方法在所有其他服务提供器都注册之后才会调用,这就意味着你可以调用其他注册的服务,这是一个好习惯尽可能不要在register 放置调用其他 Provider的功能。
<?php
namespace App\Providers;
// 这个要引入,否则View 无法使用
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class TestShareViewProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
// 通过这种方法就可以很简答的共享数据。
View::share("sitename", "Laravel - PHP");
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
- 接下来把这个
ServiceProvider (服务提供者)
加入到config/app.php
中
# 找到 `providers` 配置段落,添加刚才我们创建的服务提供者。
App\Providers\TestShareViewProvider::class
- 接下来建立一个视图文件
resources/views/test-share.blade.php
<h1>
{{$site_name}}
</h1>
- 简单的测试一下,在
/routes/web.php
添加一个路由
/**
* 创建一个测试用的路由,加载页面如果正常显示共享的 sitename 那么就表示成功
*/
Route::get('/test/shareview', function() {
return view("test-share", []);
});
-
如果没有配置http服务器,测试的时候可以启动测试服务
$ php artisan serve
-
访问
http://localhost:8000/test/shareview
locahost:7003 是我本机的测试地址。
ServiceProvider 共享数据的改进
上面的方法,不适用太复杂的逻辑,会导致 Provider类的过于庞大。
这就用到 View::composer(“viewname”, “DoClass”) 这个方法,通过这个方法可以指定到底是哪个视图可以应用到哪个类,其中,DoClass 必须具有
compose(View $view)
方法用于接收调用注入。为了测试上面的内容,我们在
app/Http/Views/Composers/
下面创建一个CLeftBarComposer.php
代码如下:
<?php
namespace App\Http\Views\Composers;
use Illuminate\View\View;
class CLeftBarComposer {
/**
* 必须要实现的方法,会接收View::composer 方法的注入
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('leftmsg', "This's left msg.");
}
}
- 建立好后修改
app/Providers/TestShareViewProvider.php
的内容:
class TestShareViewProvider extends ServiceProvider
{
/**
* 修改这个方法里里面的内容,新增 composer 解析
* @return void
*/
public function boot()
{
View::share("sitename", "Laravel - PHP");
View::composer("test-share", "App\Http\Views\Composers\CLeftBarComposer");
}
/**
* ....
*/
public function register()
{
//
}
}
- 最后简单修改一下
resources/views/test-share.blade.php
<h1>
{{$leftmsg}}
{{$sitename}}
</h1>