B3S
menu close

Laravel

Laravelの共通化に便利な機能まとめ


Uga

更新日:2024/06/18


Laravelでのシステム開発を学んでから約1年経過し、

コードの共通化による可読性の向上と、保守性の向上に力を入れれるようになってきました。

まだまだ使いこなせてはいないですが、これから共通化に使えそうな機能をまとめてみました。

 

@include

別のビュー内からBladeビューを読み込めます。親ビューで使用できるすべての変数は、読み込むビューで使用できます。

※引用:https://readouble.com/laravel/8.x/ja/blade.html

 

@include('common_parts.test')

追加でデータを渡すこともできる。

@include('common_parts.test', [{変数名} => {データ}])

 

ViewComposer

アプリケーション内の複数のルートかコントローラが同じビューを返し、常に特定のデータが必要な場合にきわめて役立ちます。

※引用:https://readouble.com/laravel/8.x/ja/views.html

 

・ServiceProviderの作成

<?php

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use View;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
      View::composer('*', YourComposer::class);
    }

 

・Composerクラスの作成

namespace App\View\Composers;

use Illuminate\View\View;
use App\Models\YourModel;

class YourComposer
{
    public function compose(View $view)
    {
        // 処理を記述
        $data = $this->yourModel->someMethodToGetData();
        $view->with('data', $data);
    }
}

 

・config/app.phpにServiceProviderを登録

'providers' => [
    // 既存のプロバイダ...
    App\Providers\ViewServiceProvider::class,
],

 

Scope

ローカルスコープ

アプリケーション全体で簡単に再利用できる、共通のクエリ制約を定義できます。

※引用:https://readouble.com/laravel/8.x/ja/eloquent.html

 

・ローカルスコープの定義

public function scopeActive($query)
{
    $query->where('active', 1);
}

 

・ローカルスコープを使用

※クラス名からscopeを除いて呼び出す

self::active()->orderBy('created_at')->get();

 

グローバルスコープ

特定のモデルのすべてのクエリに制約を追加できます。

※引用:https://readouble.com/laravel/8.x/ja/eloquent.html

 

・カスタムグローバルスコープの作成

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class ActiveScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('active', 1);
    }
}

 

・グローバルスコープの適用

protected static function booted()
{
    static::addGlobalScope(new ActiveScope());
}

 

・グローバルスコープの削除

self::withoutGlobalScope(ActiveScope::class)->get();

// クロージャ使用時
self::withoutGlobalScope('active')->get();

// すべてのグローバルスコープを削除
self::withoutGlobalScopes()->get();

// グローバルスコープの一部を削除
self::withoutGlobalScopes([
    FirstScope::class, SecondScope::class
])->get();

 

・動的な値の設定

// 動的な値を保持するためのプロパティ
protected static $dynamicValue;

protected static function booted()
{
    // グローバルスコープの追加
    static::addGlobalScope('active', function (Builder $builder) {
        if (isset(static::$activeValue)) {
            $builder->where('active', static::$activeValue);
        }
    });
}

// 動的な値を設定するためのメソッド
public static function setActiveValue($value)
{
    static::$activeValue = $value;
}

// 対象関数内で動的値をセットしてから処理を開始
public static function getData($data)
{
    // 動的値のセット
    self::setActiveValue($data->active);

    // 処理
}

Trait

再利用可能なメソッドの集まりを指すPHPの機能のこと。

※引用:https://qiita.com/nanami173/items/051140e66a6f328a59bc

 

継承元が異なるクラスでも使用できるので、コードの重複が減り保守性・可読性の向上につながります。

・Traitの作成

<?php

namespace App\Traits;

trait GetDataTrait
{
    public function getData()
    {
        // 処理内容を記述
    }
}

 

・任意の箇所でTraitを使用

class TestController
{
    // 使用するTraitを呼び出しておく
    use GetDataTrait;

    public function test(Request $request)
    {
        // Trait内のメソッドを呼び出す
        $data = $this->getData();

        // 後の処理を記述
    }
}