我正在开展一个网站项目,我正在使用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');
}
}
如何解决此问题?
答案 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版本。