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
,它扩展 Request
和 Request
实现 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 update
或 composer 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。
我刚刚安装了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
,它扩展 Request
和 Request
实现 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 update
或 composer 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。