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

我常常發現本身但願在Laravel應用程序中得到更多關於模型的結構。php

默認狀況下,模型位於 App 命名空間內,若是你正在處理大型應用程序,這可能會變得很是難以理解。因此我決定在 App\Models 命名空間內組織個人模型。app

更新用戶模型

要作到這一點,你須要作的第一件事就是將 User 模型移動到 app/Models 目錄並相應地更新命名空間。ide

這要求你更新引用 App\User 類的全部文件。this

第一個是 config/auth.phpspa

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class, // 修改這裏
        ],
    ],

第二個是 config/services.php 文件:code

'stripe' => [
        'model' => App\Models\User::class, // 修改這裏
        'key' => env('STRIPE_KEY'),
        'secret' => env('STRIPE_SECRET'),
    ],

最後,修改 database/factories/UserFactory.php 文件:ip

$factory->define(App\Models\User::class, function (Faker $faker) {
    ...
});

生成模型

如今咱們已經改變了 User 模型的命名空間,可是如何生成新的模型。正如咱們所知,默認狀況下它們將被放置在 App 命名空間下。get

爲了解決這個問題,咱們能夠擴展默認的 ModelMakeCommandstring

<?php
namespace App\Console\Commands;
use Illuminate\Foundation\Console\ModelMakeCommand 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 中來覆蓋服務容器中的現有綁定:io

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Console\Commands\ModelMakeCommand;
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,它們將位於 App\Models 命名空間中。

但願你能使用它!

更多PHP知識,可前往 PHPCasts
相關文章
相關標籤/搜索