欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

laravel5.5框架中视图间如何共享数据?视图间共享数据的两种方法

程序员文章站 2022-06-23 22:53:55
laravel框架中视图间共享数据有两种,一种是用视图门面share()方法实现,另一种是用视图门面composer() 方法实现,那么,两种方法的实现究竟是怎样的呢?让我们来看一看接下来的文章内容。 首先,需要注意的一点是:都是使用 View 门面来访问 Illuminate\Contracts\ ......

框架中视图间共享数据有两种,一种是用视图门面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() 是自定义的一个函数。

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 方法来绑定数据到视图。

所有的视图合成器都会通过 服务容器 进行解析,所以你可以在视图合成器的构造函数中类型提示需要注入的依赖项。