Phpstorm 9 EAP方法“独特”在类Illuminate \ Support \ Fluent中找不到

时间:2015-03-12 07:47:51

标签: php phpstorm laravel-5

我正在开展一个网站项目,我正在使用Laravel 5和PHPStorm 9 EAP。

我创建了迁移并使用此代码$table->string('name')->unique();,IDE突出显示了unique()并显示了消息Method "unique" not found in class Illuminate\Support\Fluent

这是我的迁移:

class CreateProductsTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('products', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name')->unique();
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('products');
}

}

如何解决此问题?

3 个答案:

答案 0 :(得分:13)

调用$table->integer('user_id')会返回Illuminate\Support\Fluent的新实例。但是Fluent类没有提供unique()方法。相反,它使用PHP魔术方法__call。这就是PHPStorm抱怨的原因。

选项一是告诉PHPStorm unique()是一种有效的方法。为此我们可以在vendor/laravel/framework/src/Illuminate/Support/Fluent.php中添加一些PHPDoc并告诉PHPStorm unique()是一种有效的方法:

/**
 * @method unique
 */
class Fluent implements ArrayAccess, Arrayable, Jsonable, JsonSerializable 
{
    // ...
}

但是我不建议修改/ vendor /文件夹中的文件。而是在Laravel上创建错误报告/拉取请求。有人已经为此创建了一个拉取请求(https://github.com/illuminate/support/pull/25)。

选项二是修改您的create方法并尝试避免Fluent界面上的魔术方法:

Schema::create('products', function(Blueprint $table)
{
    $table->increments('id');
    $table->string('name');
    $table->unique('name');
    $table->timestamps();
});

答案 1 :(得分:4)

我个人使用辅助PHP类文件(如_ide_helper.php)告诉PHPStorm方法。

对于Fluent,我创建了以下文件,由PHPStorm编制索引,但未包含在实际的php文件中:

<?php

namespace Illuminate\Support;

/**
 * @method Fluent first()
 * @method Fluent after($column)
 * @method Fluent change()
 * @method Fluent nullable()
 * @method Fluent unsigned()
 * @method Fluent unique()
 * @method Fluent index()
 * @method Fluent primary()
 * @method Fluent default($value)
 * @method Fluent onUpdate($value)
 * @method Fluent onDelete($value)
 * @method Fluent references($value)
 * @method Fluent on($value)
 */
class Fluent {}

作为旁注,您应该禁用有关乘法定义类的警告,但是如果您使用IDE Helper模块,则应该已经禁用它们。

答案 2 :(得分:2)

Laravel 5.5的更新版本

在你的rood目录中创建一个名为_ide_helper_custom.php的文件并将下一个代码复制到其中:

<?php

namespace  {
    exit("This file should not be included, only analyzed by your IDE");
}

namespace Illuminate\Support {

    /**
     * @method Fluent first()
     * @method Fluent after($column)
     * @method Fluent change()
     * @method Fluent nullable()
     * @method Fluent unsigned()
     * @method Fluent unique()
     * @method Fluent index()
     * @method Fluent primary()
     * @method Fluent spatialIndex()
     * @method Fluent default($value)
     * @method Fluent onUpdate($value)
     * @method Fluent onDelete($value)
     * @method Fluent references($value)
     * @method Fluent on($value)
     * @method Fluent charset($value)
     * @method Fluent collation($value)
     * @method Fluent comment($value)
     * @method Fluent autoIncrement()
     * @method Fluent storedAs($value)
     * @method Fluent useCurrent()
     * @method Fluent virtualAs($value)
     */
    class Fluent {

    }

}

这将强制PHP Storm为文件编制索引并正确建议链接方法。在PHP Storm 2017.3中测试过,但应该适用于所有以前和未来的IDE版本。