首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Codeigniter未定义方法‘getGet’..intelephense(1013)

Codeigniter未定义方法‘getGet’..intelephense(1013)
EN

Stack Overflow用户
提问于 2021-02-11 09:31:11
回答 3查看 5K关注 0票数 0

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

顺便说一句,即使在上面的函数中有一个警告,程序仍然可以运行,但是这个警告是恼人的。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-30 10:05:06

虽然接受的答案运行良好,但编辑vendor文件并不是一个好做法,因为下次运行composer updatecomposer install时,所有这些更改都将被撤消。

因此,不应该碰vendor文件夹。

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

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

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

代码语言:javascript
复制
<?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中定义的方法的实现以及类定义的其他方法。

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

至于CodeIgniter v4.1.2,这个问题已由框架解决,方法是将类似的解决方案应用于上述解决方案(更详细的信息可在Github diff链接上查阅)

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

票数 2
EN

Stack Overflow用户

发布于 2021-02-12 21:38:37

在屏幕截图中,您将检查显式声明为$requestRequestInterface方法,并且这个接口只有IntelliSense中显示的四个方法。它之所以有效,是因为实现该接口的类具有您要寻找的方法。

我这里没有VS代码,但是我认为如果尝试$this->request,您会发现您正在寻找什么,因为除了引用同一个对象之外,它没有显式声明的类型。

您希望看到的方法来自IncomingRequest,它扩展了RequestRequest,实现了RequestInterface

票数 0
EN

Stack Overflow用户

发布于 2021-08-23 16:18:16

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66152027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档