PhpStorm 中雄辩的 ORM 代码提示

Posted

技术标签:

【中文标题】PhpStorm 中雄辩的 ORM 代码提示【英文标题】:Eloquent ORM Code Hinting in PhpStorm 【发布时间】:2015-06-08 23:45:48 【问题描述】:

所以我刚开始使用 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 

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

User::query()->orderBy('id', 'desc');

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

我正在使用Laravel IDE Helper,它极大地帮助了将代码提示引入外墙,但对模型/构建者却没有。

有没有人可以解决这个问题?

【问题讨论】:

您是否设置了项目范围(在 phpstorm 中)? @Kyslik 你能澄清一下你的意思吗?项目的设置就像我做过的任何其他项目一样(在涉足 Laravel 之前,我们主要使用 Silex)。其他一切都正常工作,只是模型和构建器上的这几项不正常。 @JoshJanusch 我也遇到了同样的问题,你找到解决办法了吗? @Amitay 不,很遗憾,我没有取得任何进展。我刚刚放弃了,差不多。通过__call() 调用的东西太多。弄清楚 Laravel 中有哪些可用的东西真的很困难,尤其是在文档很差以及 Ottwell 记录方法参数的情况下。 @JoshJanusch 在做了更多研究后,我发现这是一个 phpstorm 错误。我检查了他们的最新版本,它仍然有错误。希望他们能尽快修复它... 【参考方案1】:

您可以尝试Laravel plug-in 用于 PhpStorm,您需要在项目设置中专门激活它。

【讨论】:

这确实改进了一些东西(路线创建、配置交互、一些额外的外观提示),但不幸的是,它对模型没有帮助。还是)感谢你的建议。这肯定会有所帮助。【参考方案2】:

对于未来的 Google 员工,如果您仍然坚持使用 Laravel,也许还有 OP。

laravel-ide-helper 包非常优雅地为您解决了这个问题,我认为这是一个相对较新的功能;生成模型 PHPDocs。

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

php artisan ide-helper:models

每个类生成的元数据如下所示:

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 

然而,这在 PHPStorm 中给我带来了问题,该软件抱怨多个类定义。幸运的是,有一个选项可以直接写入模型文件:

php artisan ide-helper:models -W

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

【讨论】:

【参考方案3】:

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

这是因为Database\Eloquent\Model.php 有一个返回\Illuminate\Database\Eloquent\Builderquery() 函数,而Eloquent\Builder 有一行:

use Illuminate\Database\Query\Builder as QueryBuilder;

然后它使用 'magic' __call 方法调用Query\Builder 中的函数。 (在Eloquent\Builder 中查找__call 方法)

见: 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' 时,这一切都将得到解决。 See last message here. :)

【讨论】:

【参考方案4】:

我希望在与查询构建器交互时进行某种明确的“强制转换”。示例...

$user = User::query()->findOrFail($id);
$user->myUserSpecialMethod(); // <-- IDE syntax error

由于我所有的模型都在扩展我的自定义基础模型,而后者又扩展了 Eloquent,所以我最终在我的自定义基础模型中创建了这个方法:

/**
 * Explicit type-hinting
 *
 * @return static
 */
static public function hint(BaseModel $model)

    return $model;

这样,解决了IDE无效错误,帮了我:

$user = User::hint(User::query()->findOrFail($id));
$user->myUserSpecialMethod(); // <-- all OK !

请注意,这不是 OOP 类型转换。这只是帮助 IDE 的提示。在我的示例中,返回的Model 已经是User。如果我在像SuperUser 这样的派生类上使用这种方法,那么只有 IDE 会被愚弄......

一个不错的替代方法是将元信息直接放在赋值语句上:

/** @var User $user */
$user = User::query()->findOrFail($id);
$user->myUserSpecialMethod(); // <-- all OK !

或者在它旁边……

$user = User::query()->findOrFail($id); /** @var User $user */
$user->myUserSpecialMethod(); // <-- all OK !

【讨论】:

【参考方案5】:

添加模型PHPDoc@mixin

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



PHPStorm 中工作

【讨论】:

这确实是一个不错的解决方案,我认为似乎不需要额外的依赖就可以解决问题。 这应该是最终的解决方案。【参考方案6】:

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

php artisan ide-helper:eloquent

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

【讨论】:

【参考方案7】:

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

use Illuminate\Database\Eloquent\Builder;
/** @mixin Builder */

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

【讨论】:

【参考方案8】:

在 Laravel 8 上验证,只需将 @mixin Builder 添加到 Illuminate\Database\Eloquent\Model.php 注释即可解决。

// Illuminate\Database\Eloquent\Model.php
/**
  * @mixin Builder
*/
abstract class Model

【讨论】:

你不能直接投票existing same answer 而不是添加另一个吗? :D

以上是关于PhpStorm 中雄辩的 ORM 代码提示的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的 ORM “独立” DB::raw 失败

php 用于PHPStorm的雄辩模型PHPDocs

PHPStorm - Laravel Eloquent 没有代码提示 [重复]

phpstorm代码提示求解

雄辩的 ORM 控制器或模型

雄辩的 orm - 放置一个数组