如何更好的組織你的Laravel模型

如來神掌發表於2019-02-16

我經常發現自己希望在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

相關文章