Laravel - Redis 缓存菜单数据

Redis缓存菜单数据-start

  • 配置:
    • 确保 .env 文件中 CACHE_DRIVER=redis ,更改缓存驱动为Redis
    • 默认的缓存前缀为 laravel ,如果想要修改前缀可以在 config/cache.php 配置文件中 'prefix' => 'laravel' ,修改此项即可。
    • Laravel默认使用的Redis数据库为 db0 ,你也可以指定其他数据库,在 config/database.php 配置文件中。
  • 缓存菜单数据:
    • 我们是通过仓库模式来获取数据的,因此我们要是想缓存菜单数据,就要在Repository仓库中编写代码。

    • 打开 app\Repositories\MenuRepository.php 文件,首先我们需要 use Cache; 一下,然后我们要在获取菜单数据的方法中判断是否有缓存这个菜单数组,如果有,则 return 缓存中的菜单数组;如果没有,怎调用获取菜单数据的方法,获取数据,并添加缓存到redis中。
      具体代码如下:
<?php 
namespace App\Repositories\Eloquent;

use App\Repositories\Eloquent\Repository;
use App\Models\Menu;
use Cache;
/**
* 菜单仓库
*/
class MenuRepository extends Repository
{
    public function model()
    {
        return Menu::class;
    }

    /*
    * 递归调用菜单数据
    */
    public function sortMenu($menus,$pid=0)
    {
        $arr = [];
        if (empty($menus)) {
            return '';
        }

        foreach ($menus as $key => $value) {
            if ($value['parent_id'] == $pid) {
                $arr[$key] = $value;
                $arr[$key]['child'] = self::sortMenu($menus,$value['id']);
            }
        }
        return $arr;
    }

    /*
    * 排序子菜单并缓存
    * ---------------------------------
    * array_column($array,$name)
    * $array => 要查询的数组
    * $name  => 在数组中要返回的字段值
    *----------------------------------
    * array_multisort($array1,$rule,$array2)
    * $array1 => 规定数组(规定以这个数组来排序)
    * $rule   => 规定排列顺序。
    * 可能的值:
    *   SORT_ASC - 默认。按升序排列 (A-Z)。
    *   SORT_DESC - 按降序排列 (Z-A)。
    * $array2 => 要规定的数组。(要排序的数组)
    */
    public function sortMenuSetCache()
    {
        $menus = $this->model->orderBy('sort','desc')->get()->toArray();
        if ($menus) {
            $menuList = $this->sortMenu($menus);
            foreach ($menuList as $key => $value) {
                if ($value['child']) {
                    $sort = array_column($value['child'], 'sort');
                    array_multisort($sort,SORT_DESC,$value['child']);
                }
            }

            //缓存菜单数据
            Cache::forever(config('admin.globals.cache.menuList'), $menuList);
            return $menuList;
        }
        return '';
    }

    /*
    * 获取菜单数据
    */
    public function getMenuList()
    {
        /*
        * 判断缓存是否存在
        */
        if (Cache::has(config('admin.globals.cache.menuList'))) {
            return Cache::get(config('admin.globals.cache.menuList'));
        }
        return $this->sortMenuSetCache();
    }

该页面方法中的config('admin.globals.cache.menuList') 是调用的一个配置文件中的一个键值,larave推荐把一些重复使用的名称统一定义到一个配置文件中,然后用config(参数1) 方法来调用该键值对的值。
参数1:键值对中值的路径。
Config方法默认的路径为 config 文件夹下面,我们在config文件夹下面新建一个admin的文件夹,再从admin文件夹下面新建一个 globals.php 的文件,在这个文件里写要重复调用的键值。整个方法是return一个数组,然后从这个数组中写参数。具体代码如下:

<?php

return [
    // 自定义登录字段
    'username' => 'username',
    'cache'    => [
        'menuList' => 'menuList',
    ],
];

Redis缓存菜单数据-end

本作品采用《CC 协议》,转载必须注明作者和本文链接
老郭博客:laughing: 个人博客地址:www.phpsix.com
PHPSIX
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

嗯,写的漂亮! 如何调用这些数据到视图呢!关键的部位没有讲!呵呵

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!