【问题标题】:Codeigniter Undefined method 'getGet'.intelephense(1013)Codeigniter 未定义的方法'getGet'.intelephense(1013)
【发布时间】:2021-02-11 09:31:11
【问题描述】:

我刚刚安装了Codeigniter 4.1.1,安装过程很顺利,没有任何警告 但是我的 VSCode 没有检测到一些函数,它们是 getGet()、getPost()、getVar() 和所有其他传入请求函数。 虽然这个功能在4.0.x版本很好用,但是为什么4.1.x就不行了呢?

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

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

【问题讨论】:

    标签: php visual-studio-code codeigniter-4


    【解决方案1】:

    虽然接受的答案可以正常工作,但编辑 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 数据成员,如下所示:

    <?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 link))

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

    【讨论】:

      【解决方案2】:

      打开你的控制器类

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

      protected $request; 之上的文档注释从

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

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

      【讨论】:

      • 虽然这个解决方案似乎工作正常,但不建议编辑供应商文件,也不认为是一种好的做法,因为执行 composer installcomposer update 最终会导致这些修改已删除。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这是评论而不是答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-19
        • 2021-09-15
        • 1970-01-01
        • 2021-08-01
        • 2021-12-08
        • 1970-01-01
        相关资源
        最近更新 更多