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)
如果您需要调整行为,还有一些选项和设置可用,但这是它的要点.
添加模型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)
如果您使用 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
。
有点晚了,但我最近遇到了同样的问题,所以我想我应该记下:
这是因为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' 时,这一切都可以解决。请参阅此处的最后一条消息。:)
只需在模型类中导入 Eloquent Builder 并添加 mixin:
\nuse 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
)
归档时间: |
|
查看次数: |
17232 次 |
最近记录: |