雄辩的ORM代码在PhpStorm暗示

问题描述:

所以我刚刚开始与Laravel(使用v5)和雄辩。我正在得到一些基本的API和运行,注意到了很多的工作方法不PhpStorm的代码提示显示雄辩的ORM代码在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()创建一个雄辩Builder对象和orderBy()举止得体,并没有错误。但是,当我输入User::query()->时,PhpStorm不会显示orderBy()(或take(),skip(),我相信其他人),并在我实际使用它时发出警告。

我使用的是Laravel IDE Helper,它极大地帮助我们为Facades带来了代码提示,而不是模型/建造者。

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

+0

你有没有设置范围为项目(内phpstorm)? – Kyslik 2015-04-04 01:59:37

+0

@Kyslik你能澄清你的意思吗?项目的设置与我曾经做过的其他任何项目一样(我们主要在进入Laravel之前使用Silex)。其他一切正常工作,只是模型和建设者没有这几个项目。 – 2015-04-04 02:49:50

+0

@JoshJanusch我遇到同样的问题,你有没有找到解决方案? – Amitay 2015-05-21 07:58:06

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

+2

这绝对改进了一些东西(路线创建,配置交互,一些额外的门面暗示),但不幸的是,它并没有帮助模型。还是)感谢你的建议。这绝对会有帮助。 – 2015-04-06 15:36:28

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

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 

有可用的几个选项和设置,如果你需要调整的行为,但是这是它的要点。

+0

这应该是公认的答案。 – baris1892 2016-08-01 13:57:25

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

这是因为Database\Eloquent\Model.php具有query()函数返回\Illuminate\Database\Eloquent\BuilderEloquent\Builder有一行:

use Illuminate\Database\Query\Builder as QueryBuilder; 

然后它使用'magic'__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的'特质'来代替。 See last message here. :)

我想在与查询构建器交互时进行某种明确的“投射”。例如...

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

由于我的所有车型都延长我的自定义的基本模型,又扩展侃侃而谈,我已经结束了在创建我的自定义基本模型这种方法:

/** 
* 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。如果我woud使用此方法像SuperUser派生类中,只有IDE将被愚弄......

一个不错的选择,也就是把元信息直接在赋值语句:

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

或NEXT它...

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

添加模型PHPDoc的@mixin

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

} 

PHPStorm工作

或加入\Illuminate\Database\Eloquent\Model

PHPDoc的

/** 
    * @mixin \Eloquent 
    */ 
abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable 
...