雄辩的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带来了代码提示,而不是模型/建造者。
有没有人有解决这个问题?
您可以尝试Laravel plug-in为PhpStorm,您需要在您的项目设置中专门激活它。
这绝对改进了一些东西(路线创建,配置交互,一些额外的门面暗示),但不幸的是,它并没有帮助模型。还是)感谢你的建议。这绝对会有帮助。 – 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
有可用的几个选项和设置,如果你需要调整的行为,但是这是它的要点。
这应该是公认的答案。 – baris1892 2016-08-01 13:57:25
有点晚,但最近我有同样的问题,所以我想我应该把记下来:
这是因为Database\Eloquent\Model.php
具有query()
函数返回\Illuminate\Database\Eloquent\Builder
和Eloquent\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
...
你有没有设置范围为项目(内phpstorm)? – Kyslik 2015-04-04 01:59:37
@Kyslik你能澄清你的意思吗?项目的设置与我曾经做过的其他任何项目一样(我们主要在进入Laravel之前使用Silex)。其他一切正常工作,只是模型和建设者没有这几个项目。 – 2015-04-04 02:49:50
@JoshJanusch我遇到同样的问题,你有没有找到解决方案? – Amitay 2015-05-21 07:58:06