laravel下视图间共享数据

25 篇文章 1 订阅
本文介绍了在 Laravel 项目中处理复杂数据共享的三种方法:通过控制器、视图门面的share方法以及视图生成器。视图生成器在呈现视图时自动绑定数据,尤其适用于多路由共享同一视图的情况。通过创建ViewShareServiceProvider并注册视图生成器,实现了在每次渲染视图时获取登录用户信息和权限。
摘要由CSDN通过智能技术生成
背景

最近在升级一个很老的项目,最后使用了laravel8处理项目,项目比较复杂,前端有三个登录注册的功能;所以登录以后,就需要传输登录的账号以及该账号有的权限到页面,这里就设计到了数据共享;

过程
方法一:使用控制器

定义三个基础控制器,在 __construct() 中获取需要的登录用户信息,然后需要该信息的模块继承对应的基础控制器(注:laravel执行顺序是先构造方法,再中间件)

方法二:试图门面share()方法实现

在这里插入图片描述
然后在boot()方法里添加两行进行测试:

View::share('name1', 'first name');

//也可使用

view()->share('name2','second  name');

前端页面随便任何地方都可以加上 $name1 和 $name2

这样前端所有页面都可以显示出共享的数据,但是缺点是,在AppServiceProvider 这个函数中无法获取缓存,只能指向性的从数据库中查询一些定向数据或者自定义一些变量值,使用起来局限性比较大

方法三:视图门面composer() 方法实现

视图生成器是在呈现视图时调用的回调或类方法。如果希望每次呈现视图时将数据自动绑定到视图中,则视图生成器可以帮助你将这些逻辑组织到一起。如果应用程序中的多个路由或控制器返回同一个视图,并且始终需要特定的数据,那么视图生成器可能特别有用。
通常情况下,视图生成器在应用程序中的某个 服务提供者 里注册。

在本例中,我们将创建一个新的 \Providers\ViewShareServiceProvider来容纳本逻辑。
我们将使用 View facade 的 composer 方法来注册视图生成器。Laravel 没有存放视图生成器的默认目录,所以你可以随意地组织它们。举个例子,你可以创建一个 app/Http/View/Composers 目录来存放应用中的所有的视图生成器:

  • 步骤1:
<?php

namespace App\Providers;

use App\Http\View\Composers\HrComposer;
use App\Http\View\Composers\UserComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewShareServiceProvider extends ServiceProvider
{
    /**
     * 注册应用服务
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * 引导应用服务
     *
     * @return void
     */
    public function boot()
    {
        // 使用基于类的生成器
        View::composer('enterprise.*', HrComposer::class);//hr
        View::composer(['pc.*','hunter.*'], UserComposer::class);//user

    }
}

  • 步骤2
    如果你创建了新的一个服务提供者来存放你注册视图生成器的代码,那么你需要将这个服务提供器添加到配置文件 config/app.phpproviders 数组中。
  • 步骤3

注册了视图生成器,每次渲染视图的时候,都会执行 App\Http\View\Composers\HrComposer类的 compose 方法。那么下面我们来定义视图生成器的这个类

<?php

namespace App\Http\View\Composers;

use App\Services\HospitalService;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Route;
use Illuminate\View\View;

class HrComposer
{
    public $user_permission_menu;
    /**
     * 创建一个 视图生成器
     *
     * @return void
     */
    public function __construct()
    {
        // 依赖项由服务容器自动解析...
    }

    public function compose(View $view){

        //获取登录的企业信息
        $oHospital = '';
        if (auth()->check()){
            $this->user_permission_menu = Cache::get('user_power_'.auth()->user()->id);
            $oHospital = HospitalService::getHospitalInfo(auth()->user()->id);
        }

        $current_route_name = Route::currentRouteName();

        $view->with([
            'power'=>$this->user_permission_menu,
            'oHospital'=>$oHospital,
            'current_route_name' => $current_route_name
        ]);

    }
}

结果

这样,就可以在视图即将渲染时,执行试图生成器,将数据自动绑定到视图中,试图里,就可以获取你需要的数据喽

Laravel 中创建视图非常简单,只需要在 `resources/views` 目录下创建一个 `.blade.php` 后缀的文件即可。视图中可以包含 HTML、CSS、JavaScript 等前端代码,并且可以通过 Blade 模板引擎来方便地嵌入 PHP 代码。 在视图中,我们可以通过控制器向视图中传递数据。一般来说,我们可以通过以下两种方式来传递数据: 1. 使用 `with` 方法传递数据: 在控制器中,可以使用 `with` 方法来传递数据。例如: ```php public function index() { $data = ['name' => 'John', 'age' => 30]; return view('welcome')->with($data); } ``` 在视图中,可以使用以下方式来获取传递过来的数据: ```php <h1>Welcome {{ $name }}</h1> <p>Your age is {{ $age }}</p> ``` 2. 使用数组传递数据: 在控制器中,可以将数据存储在一个数组中,并将该数组传递到视图中。例如: ```php public function index() { $data = ['name' => 'John', 'age' => 30]; return view('welcome', $data); } ``` 在视图中,可以使用以下方式来获取传递过来的数据: ```php <h1>Welcome {{ $name }}</h1> <p>Your age is {{ $age }}</p> ``` 除了以上两种方式,我们还可以使用 `compact` 方法来传递数据。例如: ```php public function index() { $name = 'John'; $age = 30; return view('welcome', compact('name', 'age')); } ``` 在视图中,可以使用以下方式来获取传递过来的数据: ```php <h1>Welcome {{ $name }}</h1> <p>Your age is {{ $age }}</p> ``` 值得注意的是,如果我们需要在多个控制器方法中传递相同的数据,可以使用视图共享数据功能。具体做法是,在 `AppServiceProvider` 类的 `boot` 方法中使用 `view` 函数来共享数据。例如: ```php public function boot() { view()->share('siteName', 'My Blog'); } ``` 在视图中,可以使用以下方式来获取共享数据: ```php <h1>Welcome to {{ $siteName }}</h1> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值