我經常發現自己希望在Laravel應用程式中獲得更多關於模型的結構。
預設情況下,模型位於 App
名稱空間內,如果你正在處理大型應用程式,這可能會變得非常難以理解。所以我決定在 AppModels
名稱空間內組織我的模型。
更新使用者模型
要做到這一點,你需要做的第一件事就是將 User
模型移動到 app/Models
目錄並相應地更新名稱空間。
這要求你更新引用 AppUser
類的所有檔案。
第一個是 config/auth.php
:
`providers` => [
`users` => [
`driver` => `eloquent`,
`model` => AppModelsUser::class, // 修改這裡
],
],
第二個是 config/services.php
檔案:
`stripe` => [
`model` => AppModelsUser::class, // 修改這裡
`key` => env(`STRIPE_KEY`),
`secret` => env(`STRIPE_SECRET`),
],
最後,修改 database/factories/UserFactory.php
檔案:
$factory->define(AppModelsUser::class, function (Faker $faker) {
...
});
生成模型
現在我們已經改變了 User
模型的名稱空間,但是如何生成新的模型。正如我們所知,預設情況下它們將被放置在 App
名稱空間下。
為了解決這個問題,我們可以擴充套件預設的 ModelMakeCommand
:
<?php
namespace AppConsoleCommands;
use IlluminateFoundationConsoleModelMakeCommand as Command;
class ModelMakeCommand extends Command
{
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return "{$rootNamespace}Models";
}
}
並通過將以下內容新增到 AppServiceProvider
中來覆蓋服務容器中的現有繫結:
<?php
namespace AppProviders;
use IlluminateSupportServiceProvider;
use AppConsoleCommandsModelMakeCommand;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->extend(`command.model.make`, function ($command, $app) {
return new ModelMakeCommand($app[`files`]);
});
}
}
以上就是需要修改的。現在我們可以繼續生成模型,就像我們在我們的終端中使用的一樣:php artisan make:model Order
,它們將位於 AppModels
名稱空間中。
希望你能使用它!
更多PHP知識,可前往PHPCasts