我们正在一个laminas项目上运行php,遇到错误。
作为一个例子,在控制器中我们有一些正常工作的标准代码。
$request = $this->getRequest();
if ($request->isPost()){…}
然而phpstan在抱怨:
调用未定义方法LaminasStdlibRequestInterface::isPost()
问题出现,getRequest()实际上返回LaminasHttpPhpEnvironmentRequest的实例,它继承了LaminasHttpRequest的isPost函数。但是这个函数没有在RequestInterface中定义。
一个解决方案是在RequestInterface中定义isPost,尽管我更愿意避免更改供应商代码。
有没有更好的方法来解决这个问题?
(一个迟来的回答,但也许有人会发现它有用。)
LaminasMvcControllerAbstractController
类型提示其请求为LaminasStdlibRequestInterface
。从技术上讲,它不一定是LaminasHttpRequest
的实例,因为您可以在控制台应用程序中使用Laminas控制器。以下是解决这个问题的一些方法。
(A)检查getRequest()
类型
如果您确保方法返回的实际上是LaminasHttpRequest
:
,则PHPStan不应该抱怨。$request = $this->getRequest();
if (! $request instanceof LaminasHttpRequest) {
// throw or return
}
assert()
也可以。
(B)给PHPStan更多Laminas的见解
Laminas Framework的PHPStan扩展使getRequest()
在PHPStan测试期间返回一个实际的响应实例而不是接口。请参考软件包README获取安装说明。
(C)忽略警告
PHPStan支持各种方法来忽略它的错误,详见他们的网站。通过使用配置文件,您可以忽略匹配指定正则表达式的错误。在本例中,最小配置如下所示:parameters:
ignoreErrors:
- '#Call to an undefined method Laminas\Stdlib\RequestInterface::isPost()#'