UserFactory 中 $factory 變數的來源

Falcon發表於2020-05-28

導語:$factory這個變數到底是在哪裡定義的,database/factories目錄下的檔案是什麼時候被執行的?


圖1(database/factories/UserFactory.php)
如上圖所示,在這個檔案中,$factory這個變數哪裡來的,這段程式碼又是在哪裡被執行的?


圖2(\Illuminate\Database\Eloquent\Factory)
圖2黃色矩形框就是問題中的$factory,紅色矩形框中的$file表示了database/factories下的各個factory檔案,下面的require表示執行這些檔案中的程式碼。
可以在這個foreach迴圈中列印這個$file->getRealPath(),結果就是database/factories下的各個factory檔案。

如圖1中黃色矩形框所示,$factory這個變數就是\Illuminate\Database\Eloquent\Factory這個類的例項物件。在Laravel中,類的例項物件一般是在ServiceProvider中被建立的,所以找到與這個類最近的ServiceProvider,Illuminate\Database\DatabaseServiceProvider。在這個類的registerEloquentFactory方法中,

\Illuminate\Database\Eloquent\Factory物件的例項被建立了。圖中的EloquentFactory,是Factory的別名,可以在檔案的最上面看到。
深入Factory的構造方法,如圖

發現是new了一個物件然後呼叫了load方法,接下去就和結論中講的一樣了。

通過這次探索,我感覺\database\factories下的檔案就像是配置檔案,通過執行這些檔案中的程式碼,給Factory物件的屬性賦值,後面通過facroty這個幫助方法具體執行的時候,就從物件的屬性中取值就行了。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章