Codeigniter 未定义方法 'getGet'.intelephense(1013)

Codeigniter Undefined method 'getGet'.intelephense(1013)

我刚刚安装了Codeigniter 4.1.1,安装过程很顺利,没有任何警告 但是我的 VSCode 没有检测到一些函数,它们是 getGet()、getPost()、getVar() 和所有其他 incomingRequest 函数。 尽管该功能在版本 4.0.x 中运行良好,但为什么不能在版本 4.1.x 中运行?

对了,虽然上面的函数有警告,程序还是可以的运行,但是警告看的很烦人

截图我的VSCode:https://prnt.sc/z2pevk

在您的屏幕截图中,您正在检查显式声明为 RequestInterface$request 方法,而此接口只有 IntelliSense 中显示的四种方法。它之所以有效,是因为实现该接口的 class 具有您正在寻找的方法。

我这里没有 VS Code,但我想如果尝试 $this->request 你会找到你要找的东西,因为除了是同一对象的引用之外,它没有明确声明的类型.

您希望显示的方法来自 IncomingRequest,它扩展 RequestRequest 实现 RequestInterface.

打开你的控制器class

\vendor\codeigniter4\framework\system\Controller.php

protected $request; 上的文档注释更改为

/**
* Instance of the main Request object.
*
* @var RequestInterface
*/

/**
 * Instance of the main Request object.
 *
 * @var IncomingRequest
 */

虽然接受的答案工作正常,但编辑 vendor 文件不是一个好习惯,因为下次您 运行 composer updatecomposer install 所有这些更改都会撤消。

因此,不应触摸 vendor 文件夹。

回到问题的上下文,这个错误背后的原因是 RequestInterface 只强制 class 实现以下方法:

  • getIPAddress(): string
  • isValidIP(string $ip, string $which = null): bool
  • getMethod(bool $upper = false): string
  • getServer($index = null, $filter = null)

CodeIgniter Controllers 文件夹通常包含一个 BaseController class ,所有其他控制器都继承自它,所以您可以做的就是简单地重新定义 $request 数据成员如下:

<?php

namespace App\Controllers;

use CodeIgniter\Controller;
use CodeIgniter\HTTP\IncomingRequest; // ADD THIS LINE
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;

/**
 * Class BaseController
 *
 * BaseController provides a convenient place for loading components
 * and performing functions that are needed by all your controllers.
 * Extend this class in any new controllers:
 *     class Home extends BaseController
 *
 * For security be sure to declare any new methods as protected or private.
 */

class BaseController extends Controller
{

    /**
     * Instance of the main Request object.
     *
     * @var IncomingRequest
     */
    protected $request; // NOTICE THIS LINE AND THE COMMENT ABOVE IT

    /**
     * An array of helpers to be loaded automatically upon
     * class instantiation. These helpers will be available
     * to all other controllers that extend BaseController.
     *
     * @var array
     */
    protected $helpers = [];

    /**
     * Constructor.
     *
     * @param RequestInterface  $request
     * @param ResponseInterface $response
     * @param LoggerInterface   $logger
     */
    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        // Do Not Edit This Line
        parent::initController($request, $response, $logger);

        //--------------------------------------------------------------------
        // Preload any models, libraries, etc, here.
        //--------------------------------------------------------------------
        // E.g.: $this->session = \Config\Services::session();
    }
}

我们所做的只是将类型从 RequestInterface 切换为 IncomingRequest,其中包含 RequestInterface 中定义的方法的实现以及 class 中定义的其他方法].

请注意,$request 数据成员的访问修饰符需要为 protected,因为其他控制器将继承该控制器。

至于 CodeIgniter v4.1.2,框架已通过对上述问题应用类似的解决方案解决了此问题((更多详细信息可在 Github diff link))

希望我已经给出了一个很好的详细解释。

只是从 BaseController 扩展而不是通过 Controller。