在PhpStorm中雄辩的ORM代码提示

Jos*_*sch 23 php phpstorm laravel eloquent

所以我刚开始使用Laravel(使用v5)和Eloquent.我正在努力获得一些基本的API并注意到很多工作方法都没有出现在PhpStorm的代码提示中

所以我有这个模型:

namespace Project\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model 
    implements AuthenticatableContract, CanResetPasswordContract {
}
Run Code Online (Sandbox Code Playgroud)

在我的一个控制器中,我尝试做

User::query()->orderBy('id', 'desc');
Run Code Online (Sandbox Code Playgroud)

User::query()创建一个Eloquent Builder对象,orderBy()行为正确,没有错误.但是,当我输入时,PhpStorm不显示orderBy()(或者take(),skip()我确定其他人),User::query()->并在我实际使用它时发出警告.

我正在使用Laravel IDE Helper,它非常有助于为Facades提供代码提示,但不会对它看起来的模型/构建提供帮助.

有人有解决方案吗?

Eri*_*son 63

对于未来的Google员工,如果您仍然坚持使用Laravel,也可能是OP.

laravel-IDE辅助包解决了这个问题对你相当漂亮,与我所相信的是一个相对较新的功能; 生成模型PHPDocs.

您可以使用以下命令为所有PHPDoc生成单独的文件:

php artisan ide-helper:models
Run Code Online (Sandbox Code Playgroud)

生成的元数据对于每个类看起来都是这样的:

namespace App {
/**
 * App\Post
 *
 * @property integer $id
 * @property integer $author_id
 * @property string $title
 * @property string $text
 * @property \Carbon\Carbon $created_at
 * @property \Carbon\Carbon $updated_at
 * @property-read \User $author
 * @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments
 */
class Post {}
}
Run Code Online (Sandbox Code Playgroud)

这在PHPStorm中引起了我的问题,但软件抱怨多个类定义.幸运的是,一个选项可以直接写入模型文件:

php artisan ide-helper:models -W
Run Code Online (Sandbox Code Playgroud)

如果您需要调整行为,还有一些选项和设置可用,但这是它的要点.


Ден*_*ний 8

添加模型PHPDoc@mixin

/**
 * Class News
 * @property int $id
 * @property string $created_at
 * @property string $updated_at
 * @mixin \Eloquent
 * @package App
 */
class News extends Model
{

}
Run Code Online (Sandbox Code Playgroud)

PHPStorm中工作

或添加到 \Illuminate\Database\Eloquent\Model

PHP文档

/**
  * @mixin \Eloquent
  */
abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable
...
Run Code Online (Sandbox Code Playgroud)

  • `@mixin \Eloquent` 对我不起作用 - 它不被识别为一个类。然而,我最终使用了“@mixin Builder”(与“use Illuminate\Database\Query\Builder”一起使用),并且它可以工作 - 伴随着我使用“[Model]::where(...)”的额外复杂性,由于某种原因它也可以工作,但是为了摆脱 PHPStorm 提示,我必须使用 `[Model]::query()->where(...)`。不知道这里发生了什么,但是嘿,只要它有效...... (2认同)

GTC*_*ais 7

如果您使用 BarryVHD 的Laravel IDE Helper包,请运行:

php artisan ide-helper:eloquent
Run Code Online (Sandbox Code Playgroud)

这将写入/** @mixin \Eloquent */文件vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php


mir*_*rza 5

你可以试试PhpStorm的Laravel插件,你需要在你的项目设置中专门激活它。

  • 这确实改进了一些东西(路由创建、配置交互、一些额外的 Facade 提示),但不幸的是它对模型没有帮助。还是)感谢你的建议。这肯定会有所帮助。 (2认同)

Evr*_*sen 5

有点晚了,但我最近遇到了同样的问题,所以我想我应该记下:

这是因为Database\Eloquent\Model.php有一个query()返回的函数\Illuminate\Database\Eloquent\Builder并且Eloquent\Builder有一行:

use Illuminate\Database\Query\Builder as QueryBuilder;
Run Code Online (Sandbox Code Playgroud)

然后它使用“神奇”的 __call 方法来调用Query\Builder. (在 中查找__call方法Eloquent\Builder

请参阅: http://php.net/manual/en/language.oop5.overloading.php#object.call

当调用对象上下文中不可访问的方法时,会触发 __call() 。

因此,您所调用的方法确实无法访问:) IDE 能做的事情并不多。

有一些解决方法,例如使用@method标签,但它是不可维护的。另一种方法是使用@mixin(但这不是基于标准的)。请参阅: https: //github.com/laravel/framework/issues/7558

我认为当他们摆脱 Laravel 代码中的所有魔法调用并使用 PHP 'traits' 时,这一切都可以解决。请参阅此处的最后一条消息。:)


imp*_*ekt 5

只需在模型类中导入 Eloquent Builder 并添加 mixin:

\n
use Illuminate\\Database\\Eloquent\\Builder;\n/** @mixin Builder */\n
Run Code Online (Sandbox Code Playgroud)\n

要一次覆盖所有模型 \xe2\x80\x94 将 mixin 添加到src/Illuminate/Database/Eloquent/Model.php)

\n