phpstorm 使用 redis 类提示方法未定义

1. 运行环境

1). 当前使用的 Laravel 版本?

Laravel Framework Lumen (8.2.4) (Laravel Components ^8.0)

2). 当前使用的 php/php-fpm 版本?

PHP 版本:

PHP 7.4.28 (cli) (built: Feb 24 2022 01:23:31) ( NTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v2.9.8, Copyright (c) 2002-2020, by Derick Rethans

php-fpm 版本:CGI/FastCGI 1.1

3). 当前系统

Windows 10

4). 业务环境

开发环境,手动搭建的 wnmp

5). 相关软件版本

Nginx 1.20.2

2. 问题描述?

使用了 ide helper 还是提示方法未定义

博客:Laravel 超好用代码提示工具 Laravel IDE Helper

phpstorm 使用 redis 类提示方法未定义

phpstorm 使用 redis 类提示方法未定义

env 文件

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=redis
REDIS_PORT=6379
REDIS_DB=2
REDIS_CLIENT=phpredis

相关代码

use Illuminate\Support\Facades\Redis;

if(Redis::get($key)){
 Redis::del($key);
}
$lock = Redis::setnx($key, json_encode($data));

3. 您期望得到的结果?

能直接跳转到方法定义的地方

4. 您实际得到的结果?

phpstorm 使用 redis 类提示方法未定义

感谢阅读,有收获的话不妨点个赞:smiling_imp:
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

把这段加到你的代码里

/**
             * Get a Redis connection by name.
             *
             * @param string|null $name
             * @return \Illuminate\Redis\Connections\Connection|\Predis\Client
             * @static
             */
            public static function connection($name = null)
            {
                /** @var \Illuminate\Redis\RedisManager $instance */
                return $instance->connection($name);
            }

加到这个大括号里

file

2年前 评论
讨论数量: 18

如果使用的是phpredis扩展的话这样使用,ide会有提示并可以跳转。

$redis = new \Redis;
$redis->connect('127.0.0.1');
$redis->setnx();
2年前 评论
Junwind

在使用的前面加一行 /** @var \Redis $redis */

2年前 评论
Redis::connection()->get();

这样才会有提示,我一般是这么用

2年前 评论
declandragon (楼主) 2年前

@declandragon 我测试是都有啊,是不是你版本不一样 file

2年前 评论

@renxiaotu 感谢回复。 版本是这个 :Laravel Framework Lumen (8.2.4) (Laravel Components ^8.0)

使用的时候如下图

file

2年前 评论

@declandragon 看来8开始\Illuminate\Redis\Connections\Connection这个文件少了一段注释,应该是这个导致的


//"laravel/framework": "5.7.*"
/**
 * @mixin \Predis\Client
 */
abstract class Connection
{



//"laravel/framework": "^8.12"
abstract class Connection
{
2年前 评论
随波逐流
/**
 * 首先要明确自己的redis驱动是phpredis,还是predis, 使用注释引导IDE
 *
 * - phpredis \Redis, php扩展, 命名空间是根空间
 * - predis \Predis\Client 轮子
 *
 * @var \Predis\Client $redis
 */
dd($redis->get('key-1'));
2年前 评论
declandragon (楼主) 2年前

在你的_ide_helper.php文件的namespace Illuminate\Support\Facades {的下面加上下面这段,也许能解决你的问题,前提是你用的Predis,如下:


    namespace Illuminate\Support\Facades {//粘贴到这句后面

      //复制下面这段
        //复制开始
        class Redis
        {

            /**
             * Get a Redis connection by name.
             *
             * @param string|null $name
             * @return \Illuminate\Redis\Connections\Connection|\Predis\Client
             * @static
             */
            public static function connection($name = null)
            {
                /** @var \Illuminate\Redis\RedisManager $instance */
                return $instance->connection($name);
            }
        }
        //复制结束
2年前 评论

ide helper 里面的 redis 是这样的

    /**
     * @see \Illuminate\Redis\Connections\Connection::throttle
     * @method static \Illuminate\Redis\Limiters\DurationLimiterBuilder throttle(string $name)
     * @see \Illuminate\Redis\RedisManager::resolve
     * @method static \Illuminate\Redis\Connections\Connection resolve(null|string $name = null)
     * @see \Illuminate\Redis\Connections\Connection::funnel
     * @method static \Illuminate\Redis\Limiters\ConcurrencyLimiterBuilder funnel(string $name)
     * @see \Illuminate\Redis\RedisManager::purge
     * @method static void purge(null|string $name = null)
     * @see \Illuminate\Redis\Connections\Connection::psubscribe
     * @method static void psubscribe(array|string $channels, \Closure $callback)
     * @see \Illuminate\Redis\Connections\Connection::setEventDispatcher
     * @method static void setEventDispatcher(\Illuminate\Contracts\Events\Dispatcher $events)
     * @see \Illuminate\Redis\RedisManager::setDriver
     * @method static void setDriver(string $driver)
     * @see \Illuminate\Redis\Connections\Connection::listen
     * @method static void listen(\Closure $callback)
     * @see \Illuminate\Support\Traits\Macroable::hasMacro
     * @method static bool hasMacro(string $name)
     * @see \Illuminate\Redis\Connections\Connection::getEventDispatcher
     * @method static \Illuminate\Contracts\Events\Dispatcher getEventDispatcher()
     * @see \Illuminate\Redis\Connections\Connection::client
     * @method static mixed|\Redis client()
     * @see \Illuminate\Redis\RedisManager::connection
     * @method static \Illuminate\Redis\Connections\Connection connection(null|string $name = null)
     * @see \Illuminate\Redis\RedisManager::connections
     * @method static array connections()
     * @see \Illuminate\Redis\Connections\Connection::createSubscription
     * @method static void createSubscription(array|string $channels, \Closure $callback, string $method = 'subscribe')
     * @see \Illuminate\Redis\RedisManager::enableEvents
     * @method static void enableEvents()
     * @see \Illuminate\Support\Traits\Macroable::macro
     * @method static void macro(string $name, callable|object $macro)
     * @see \Illuminate\Redis\Connections\Connection::subscribe
     * @method static void subscribe(array|string $channels, \Closure $callback)
     * @see \Illuminate\Redis\RedisManager::disableEvents
     * @method static void disableEvents()
     * @see \Illuminate\Redis\Connections\Connection::command
     * @method static mixed command(string $method, array $parameters = [])
     * @see \Illuminate\Redis\RedisManager::extend
     * @method static \Illuminate\Redis\RedisManager extend(string $driver, \Closure $callback)
     * @see \Illuminate\Redis\Connections\Connection::getName
     * @method static null|string getName()
     * @see \Illuminate\Support\Traits\Macroable::mixin
     * @method static void mixin(object $mixin, bool $replace = true)
     * @see \Illuminate\Redis\Connections\Connection::setName
     * @method static \Illuminate\Redis\Connections\Connection setName(string $name)
     * @see \Illuminate\Redis\Connections\Connection::unsetEventDispatcher
     * @method static void unsetEventDispatcher()
     * @see \Illuminate\Support\Traits\Macroable::macroCall
     * @method static mixed macroCall(string $method, array $parameters)
     */
    class Redis {}
2年前 评论
declandragon (作者) (楼主) 2年前

把这段加到你的代码里

/**
             * Get a Redis connection by name.
             *
             * @param string|null $name
             * @return \Illuminate\Redis\Connections\Connection|\Predis\Client
             * @static
             */
            public static function connection($name = null)
            {
                /** @var \Illuminate\Redis\RedisManager $instance */
                return $instance->connection($name);
            }

加到这个大括号里

file

2年前 评论

加入下面这个方法,然后把 class 注释里面的对应方法删除。

    class Redis {
        /**
         * Get a Redis connection by name.
         *
         * @param string|null $name
         * @return \Illuminate\Redis\Connections\Connection|\Predis\Client|\Redis
         * @static
         */
        public static function connection($name = null)
        {
            /** @var \Illuminate\Redis\RedisManager $instance */
            return $instance->connection($name);
        }
    }
2年前 评论

感谢@chutrue 和 @renxiaotu 热心回复

use Illuminate\Support\Facades\Redis;

// 方法一
/**
 * 首先要明确自己的redis驱动是phpredis,还是predis, 使用注释引导IDE
 *
 * - phpredis \Redis, php扩展, 命名空间是根空间
 * - predis \Predis\Client 轮子
 *
 * @var \Predis\Client $redis
 */
$redis = new Redis();
$redis->get();
$redis->del();
$redis->set();
$redis->setex();


//方法二
//ide helper 文件中 class redis 中加入 connection 方法
//     class Redis {
//        /**
//         * Get a Redis connection by name.
//         *
//         * @param string|null $name
//         * @return \Illuminate\Redis\Connections\Connection|\Predis\Client|\Redis
//         * @static
//         */
//        public static function connection($name = null)
//        {
//            /** @var \Illuminate\Redis\RedisManager $instance */
//            return $instance->connection($name);
//        }
//    }
// 同时删除 class 注释中的 connection 方法
Redis::connection()->get();
Redis::connection()->del();
Redis::connection()->set();
Redis::connection()->setnx();

另外 lumen 8.0 安装 composer require barryvdh/laravel-ide-helper 有一定的坑,后续我重新开贴说明情况。

当前项目里面 _ide_helper_facades.php 是插件自动生成的,具体生成时机或者怎么触发我还没搞明白,欢迎大家留言。

file

最后再次感谢各位。

2年前 评论
declandragon (作者) (楼主) 2年前

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