Chapter 06

処理スクラップLaravel編

ta.toshio
ta.toshio
2021.04.22に更新

DarkGhostHunter/RememberableQuery

https://github.com/DarkGhostHunter/RememberableQuery

DBから取得した値をLaravel.QueryBuilderとEloquentBuilderのmacroという機能でキャッシュに保存している処理がおもしろい

パッケージディスカバリ

composer.jsonに追記して勝手にHogeServiceProviderが読み込められるようにする

package discovery
package discovery日本語 パッケージディスカバリの項

composer.jsonに以下のように書けば、config/app.phpのprovidersに追記しなくても勝手に読み込んでくれる

"extra": {
    "laravel": {
        "dont-discover": [
            "barryvdh/laravel-debugbar"
        ]
    }
},

自身をhasMany

自分のparent_idをhasManyしている。一階層ツリーを実現している。

https://github.com/avored/framework/blob/master/src/Database/Models/Menu.php

    /**
     * Menu has many sub menus.
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function submenus()
    {
        return $this->hasMany(self::class, 'parent_id');
    }

使用例
https://github.com/avored/framework/blob/master/src/Database/Repository/MenuGroupRepository.php

$modelMenus = $menuGroup->menus()->whereNull('parent_id')->get();
foreach ($modelMenus as $modelMenu) {
    $modelMenu->submenus()->remember()->get();
    $menus->push($modelMenu);
}

Facadeでメソッドが実行されるときに呼ばれるメソッド

app/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php


/**
     * Handle dynamic, static calls to the object.
     *
     * @param  string  $method
     * @param  array  $args
     * @return mixed
     *
     * @throws \RuntimeException
     */
    public static function __callStatic($method, $args)
    {
        $instance = static::getFacadeRoot();

        if (! $instance) {
            throw new RuntimeException('A facade root has not been set.');
        }

        return $instance->$method(...$args);
    }

ServiceProviderにはいろいろ登録するためのメソッドがある

  • routesを登録
    $this->loadRoutesFrom(__DIR__ . '/../routes/web.php');

  • コマンドを登録
    $this->commands([InstallCommand::class]);

  • マイグレーションファイルを登録
    $this->loadMigrationsFrom(__DIR__ . '/../database/migrations');

  • viewファイルを登録。第2引数はnamespace。
    $this->loadViewsFrom(__DIR__ . '/../resources/views', 'avored');

  • 翻訳ファイルを登録。第2引数はnamespace。
    $this->loadTranslationsFrom(__DIR__ . '/../resources/lang', 'avored');

  • config設定をマージ。
    $this->mergeConfigFrom(__DIR__ . '/../config/avored.php','avored');

  • configに設定ファイルを配置する設定(だと思う)

    /**
     * Set up the file which can be published to use the package.
     * @return void
     */
    public function setupPublishFiles()
    {
        $this->publishes([
            __DIR__ . '/../config/avored.php' => config_path('avored.php'),
        ], 'avored-config');

        $this->publishes([
            __DIR__ . '/../assets/avored-admin' => public_path('avored-admin'),
        ], 'avored-public');
    }

インスタンス生成の方法が分からない場合

resolveヘルパーメソッドで解決できる。
resolve(\AvoRed\Framework\Database\Models\Customer::class)