laravel框架中视图间共享数据有两种,一种是用视图门面share()方法实现,另一种是用视图门面composer() 方法实现,那么,两种方法的实现究竟是怎样的呢?让我们来看一看接下来的文章内容。
首先,需要注意的一点是:都是使用 View 门面来访问 Illuminate\Contracts\View\Factory 的底层实现
视图门面share()方法
有时需要在所有视图之间共享数据片段,这时候可以使用视图门面的 share 方法。
1,一般情况下,我会在app\http\Controllers\xx下创建一个基础控制器 BaseController.php,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
namespace App\Http\Controllers\ExtMan;
use Illuminate\Routing\Controller;
class BaseController extends Controller
{
public function __construct(\Auth $auth )
{
$this ->initViewShare(); //视图共享数据
}
/**
* 视图共享数据方法
*/
public function initViewShare()
{
view()->share( 'action_name' ,get_action_name()); //当前URL的方法器名
}
}
//视图使用
//共享视图一般都是在layout中
{{ $action_name }}
|
get_action_name() 是自定义的一个函数。
链接:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g 提取码:x2p5
免费分享,但是X度限制严重,如若链接失效点击链接或搜索加群 群号518475424。
tips:
创建 app\Helpers\ExtmanFun.php , composer.json的autoload引入
1
2
3
|
"files" :[
"app/Helpers/ExtmanFun.php"
]
|
运行 composer dump-autoload 会自动加载
2,在 AppServiceProvider 服务提供器(或者新建提供器) 的boot方法中调用share()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
namespace App\Providers;
use View;
class AppServiceProvider extends ServiceProvider
{
/**
* 启动所有应用服务
*
* @return void
*/
public function boot()
{
View::share( 'key' , 'value' );
//也可使用
view()->share( 'name' , '共享数据片段' );
}
}
|
视图门面composer()方法
视图合成器是当视图被渲染时的回调函数或类方法 ,如果你每次渲染视图时都要绑定视图的数据,比如用户登陆信息。可以使用composer() 将逻辑组织到一个单独的地方。
本例中,我们将在AppServiceProvider服务提供器中注册视图合成器,
提供器代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?php
namespace App\Providers;
# use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
// 使用基于类方法
// 第一个参数可以指定共享给那个视图,多个视图用数组,共享到全部视图可以用 *
// 或者某个目录下所有视图
view()->composer(
//'*', 'App\Http\ViewComposers\AuthComposer'
//['extman.home, welcome'], 'App\Http\ViewComposers\AuthComposer'
[ 'extman.*' ], 'App\Http\ViewComposers\AuthComposer'
);
//使用基于回调函数
view()->composer( '*' , function ( $view ){
$view ->with( 'user' , array ( 'name' => 'test' , 'avatar' => '/path/to/test.jpg' ));
});
}
other code
}
|
如果创建一个新的服务提供器来包含视图composer 注册,需要添加该服务提供者到配置文件 config/app.php 的 providers 数组中
到此已经注册了视图合成器,每次渲染 extman目录下所有视图时都会执行 AuthComposer@compose 方法。
定义视图合成器类 App\Http\ViewComposers\AuthComposer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use Illuminate\Repositories\UserRepository;
class AuthComposer
{
protected $users ;
public function __construct(UserRepository $users )
{
// 依赖注入通过服务容器自动解析...
$this ->users = $users ;
}
//绑定数据到视图
public function compose(View $view )
{
$user_info = \Auth::user();
$view ->with( 'motto' , $user_info );
$view ->with( 'count' , $this ->users-> count ());
}
}
|
视图被渲染前,AuthComposer类的 compose 方法被调用,同时 Illuminate\View\View 实例被注入该方法,从而可以使用其 with 方法来绑定数据到视图。
所有的视图合成器都会通过 服务容器 进行解析,所以你可以在视图合成器的构造函数中类型提示需要注入的依赖项。