【Laravel】Trait(トレイト)とは:使い方や作成方法について

時計 2024.05.04 / 時計

【Laravel】Trait(トレイト)とは:使い方や作成方法について

記事ではLaravelにおける、Trait(トレイト)について使い方作成方法など詳しく解説していきます。

Traitとはクラス間でコード(メソッド)を共有して再利用するための仕組みです。Traitを利用することで共通する機能をまとめることができ、コードを重複して記述する必要がなくなります。

Traitの利用はLaravelのアプリケーション開発をより効率的に行えるようになります。

ぜひ本記事を通して、LaravelのTrait(トレイト)について理解を深めてください。

Trait(トレイト)

Traitとは

TraitとはPHP5.4以降から導入された機能であり、クラス間でコードを共有する・再利用するための仕組みです。

Traitを利用することで異なるクラス階層にまたがってメソッドを共有できます。これによりコードの重複を減らし、保守性を向上させることができます。

よりわかりやすく言うと、トレイトは各クラスで共通して利用される再利用可能なメソッドの集まりです。

例えば認証やアクセス権限の確認といった機能を複数のコントローラーやモデルで利用したい場合、共通する機能をトレイトに定義し、各クラスにトレイトを使うことで機能を追加できます。

POINT

トレイトとクラスの継承は異なるアプローチです。複雑な継承構造を避けたい場合はトレイトの利用が役立ちます

Traitのメリット

Traitを利用するメリットは以下の通りです。

Traitのメリット
  • 共通の機能をまとめることで重複して記述する必要がなくなる
  • 機能をトレイトにも分割することでクラスの役割を明確化できる
  • 複雑な継承を避けて、必要な機能をクラスに組み込める
  • 共通機能を分離することで単体テストがしやすくなる

上記はトレイトを利用するメリットの一部です。これらメリットを理解してLaravelで利用しましょう。

LaravelでのTrait

Laravelが標準で提供しているトレイトには次のようなものがあります。

  • Notifiable
  • SoftDeletes
  • HasFactory
  • HasRelationships
  • Authorizable

これらトレイトはLaravelで広く利用されており、Webアプリケーション開発を効率的に進めるための機能を提供しています。

例えばSoft Deleteトレイトはデータベースのレコードを実際に削除するのではなく、削除されたことをマークして削除されたように見せる機能を提供します。ソフトデリートについて詳しくは以下記事をご参照ください。

自身でTraitを作成する場合は、LaravelではTraitをapp/Traitsフォルダに配置するのが一般的です。そしてトレイト用のPHPファイルをTraitsフォルダ内に保存していきます。

Laravel:Traitの作成方法

LaravelでTraitを作成する流れは以下の通りです。

  1. Traitsフォルダを作成する
  2. トレイト用のPHPファイルを作成
  3. 使用したいクラスでトレイトを組み込む

まずLaravelにはTrait用のフォルダがないため、app直下にTraitsフォルダを手動で作成します。

Laravel:手動でtraitsフォルダを作成

次にTrait用のPHPファイルを以下のような形で作成します。

<?php

namespace App\Traits;

trait トレイト名 {
    public function メソッド名() {
        // 処理
    }
}

クラス定義に似ていますが、classではなくtraitを使用します。そしてトレイトを定義して、その中にメソッドを定義します。

トレイトを作成したら使用したいクラスでuseキーワードを使ってトレイトをクラスに組み込みます。

実際にどのようにトレイトを作成してクラスに組み込むかは、次項より解説する例を見てください。

Traitの利用例:ログの記録

ここではログを記録するTraitを作成していきます。まずTraits内にLoggable.phpを作成します。

<?php

namespace App\Traits;

trait Loggable {
    public function log($message) {
        // ログの記録
        \Log::info($message);
    }
}

次に作成したLoggableトレイトをuseキーワードを使ってUserモデルに組み込みます。

<?php

namespace App\Models;

use App\Traits\Loggable;
use Illuminate\Database\Eloquent\Model;

class User extends Model {
    use Loggable;

    public function actionLog() {
        $this->log("アクションを実行しました");
    }
}

モデルにLoggableトレイトを組み込んだことで、Userインスタンスからlogメソッドを呼び出せるようになります。

Traitの利用例:権限管理

ここでは権限管理を行うTraitを作成していきます。作成するトレイトはユーザーが権限を持っているかを確認するものです。そして作成したトレイトはミドルウェアに組み込み、権限チェックをしたいルートにこのミドルウェアを適用します。

まずTraits内にPermissionCheck.phpを以下のように作成します。

namespace App\Traits;

trait PermissionCheck {
    public function permissionCheck($user, $permission) {
        return $user->permissions()->contains($permission);
    }
}

次にHasPermissionミドルウェアを作成します。

namespace App\Http\Middleware;

use Closure;
use App\Traits\PermissionCheck;

class HasPermission {
    use PermissionCheck;

    public function handle($request, Closure $next, $permission)
    {
        if (!$this->permissionCheck($request->user(), $permission)) {
            return redirect('home')->with('error', 'アクセス権限を持っていません.');
        }

        return $next($request);
    }
}

最後にweb.phpのルートにミドルウェアを適用することで、アクセスを試みるユーザーが権限を持っているかのチェックができるようになります。

// web.php
Route::middleware(['auth', 'HasPermission:view_users'])->group(function () {
    Route::get('/user/list', [UserController::class, 'list']);
});