2015-04-03 23 views
10

所以我剛剛開始與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

回答

3

您可以嘗試Laravel plug-in爲PhpStorm,您需要在您的項目設置中專門激活它。

+2

這絕對改進了一些東西(路線創建,配置交互,一些額外的門面暗示),但不幸的是,它並沒有幫助模型。還是)感謝你的建議。這絕對會有幫助。 – 2015-04-06 15:36:28

34

對於未來的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

3

有點晚,但最近我有同樣的問題,所以我想我應該把記下來:

這是因爲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. :)

0

我想在與查詢構建器交互時進行某種明確的「投射」。例如...

$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 ! 
0

添加模型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 
...