Phpstan 调用未定义的方法 Illuminate\Database\Eloquent\Builder::join()

问题描述 投票:0回答:1

我的php版本是7.1.31,laravel版本是4.2。 我想要 phpstan 作为我的静态分析工具。 但是当我运行它时。它输出了很多错误。

例如:

  1. 调用未定义的方法 Illuminate\Database\Eloquent\Builder::join()
  2. 调用未定义的方法 Illuminate\Database\Eloquent\Builder::select()
  3. 调用未定义的静态方法 \MatchAction::where()
  4. 调用未定义的静态方法 照亮\支持\立面\路线::get()。
  5. 调用未定义的静态方法 照亮\支持\立面\路线::post()。

示例代码

$results = MatchAction::join('users', 'matchactions.user_id', '=', 'users.id')
          ->select('users.name', 'users.email', 'matchactions.title')
          ->get(); 

这是我的示例配置文件:

parameters:

    paths:
        - application

    level: 8

php laravel eloquent phpstan
1个回答
0
投票

真正的问题是您正在使用 Laravel 4.2。在当前的 Laravel 版本(撰写本文时为 11.x)中,代码不会使 PHPStan 出错,因为 Eloquent Builder 实现了以下接口。 <?php namespace Illuminate\Contracts\Database\Query; /** * This interface is intentionally empty and exists to improve IDE support. * * @mixin \Illuminate\Database\Query\Builder */ interface Builder { }

在 laravel 4.2 中,Eloquent Builder 没有实现接口,也没有扩展基础 Builder。

在 Eloquent Builder 中找不到的每个方法都会在定义的宏中查找,然后委托给基础 Builder(这是一个属性)

比较:

laravel 4.2's Eloquent Builder


<?php
namespace Illuminate\Database\Eloquent;

...

class Builder
{
    /**
     * The base query builder instance.
     *
     * @var \Illuminate\Database\Query\Builder
     */
    protected $query;

    ...

    /**
     * Dynamically handle calls into the query instance.
     *
     * @param  string  $method
     * @param  array   $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        if (isset($this->macros[$method]))
        {
            array_unshift($parameters, $this);

            return call_user_func_array($this->macros[$method], $parameters);
        }
        elseif (method_exists($this->model, $scope = 'scope'.ucfirst($method)))
        {
            return $this->callScope($scope, $parameters);
        }

        $result = call_user_func_array(array($this->query, $method), $parameters);

        return in_array($method, $this->passthru) ? $result : $this;
    }

    ...
}

laravel 11.x's Eloquent Builder


<?php

namespace Illuminate\Database\Eloquent;

...
use Illuminate\Contracts\Database\Eloquent\Builder as BuilderContract;
...

/**
 * @template TModel of \Illuminate\Database\Eloquent\Model
 *
 * @property-read HigherOrderBuilderProxy $orWhere
 * @property-read HigherOrderBuilderProxy $whereNot
 * @property-read HigherOrderBuilderProxy $orWhereNot
 *
 * @mixin \Illuminate\Database\Query\Builder
 */
class Builder implements BuilderContract
{
    ...

    /**
     * The base query builder instance.
     *
     * @var \Illuminate\Database\Query\Builder
     */
    protected $query;

    ...
}

事实上,它甚至再次添加了 
@mixin

注释。


您可以做的一个快速而肮脏的修复是编辑供应商类以在
/** * @mixin \Illuminate\Database\Query\Builder */

类之上添加

Illuminate\Database\Eloquent\Query\Builder
注释。当然,如果您更新依赖项并且 laravel 版本发生更改(或者您(重新)安装它们),则需要重新添加此行。
应避免编辑供应商代码,但是

这是一个 phpdoc 块,没有实际功能。
  1. 如果你的项目有 laravel 4.2,我认为你更新依赖项的频率不足以导致这个问题。
© www.soinside.com 2019 - 2024. All rights reserved.