make:trait — Traitを作成するコマンド

artisan

Laravel Artisan コマンド:make:trait

何に使うか(TL;DR)

  • 目的:Trait(共通ロジックをまとめる再利用可能なコードブロック)を自動生成
  • 最低限の使い方php artisan make:trait Logger
  • よくある罠
  1. 既存ファイルがあると失敗する
  2. デフォルトで App\Traits 名前空間になる
  3. --force オプションで上書き可

概要

make:trait は、指定した名前の PHP Trait を app/Traits 配下に生成します。
生成されたファイルは App\Traits 名前空間が自動設定されます。
複数クラスで共有したい機能をまとめたいときに使用します。


コマンド構文

php artisan make:trait {name} {--force} {--plain}

引数

引数 必須 既定値 説明
name string Trait のクラス名(キャメルケース)
–force switch false 既存ファイルを上書きする
–plain switch false DocBlock 等を含めない単純な Trait を生成

戻り値

  • 標準出力に生成結果(Trait created successfully.)を表示
  • 終了コード 0 を返す

例外

  • ファイル作成時にパーミッションエラー
  • --force が無い場合、既存ファイルがあると Trait already exists で停止

使用例

最小例

php artisan make:trait Logger

生成ファイル app/Traits/Logger.php

<?php

namespace App\Traits;

trait Logger
{
    // TODO: Implement logger methods here
}

実務例(plain オプション)

php artisan make:trait AuthGuardable --plain

生成ファイル app/Traits/AuthGuardable.php

<?php

namespace App\Traits;

trait AuthGuardable
{
    public function guard()
    {
        // 通常は guard のロジックを実装
    }
}

Trait を使う例

<?php

namespace App\Models;

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

class User extends Model
{
    use AuthGuardable;

    // ...
}

よくある落とし穴・注意点

  • 名前空間の自動設定
    App\Traits が自動で設定されるため、プロジェクトの命名規則に合わせて app/Providers/AppServiceProvider.php でバインドが必要になることがあります。
  • 既存ファイルとの衝突
    同名ファイルが既にある場合、--force を付けないとエラーで停止します。上書きしたいなら必ず --force を付与。
  • PHP 8.4 での型ヒント
    Trait 内で static 型ヒントを使う場合は PHP 8.4 以降が必須。

代替・関連API

API 主な用途 選択理由
make:class 通常のクラス生成 単一責任クラス
make:interface インターフェイス生成 実装の抽象化
make:model Eloquent モデル生成 DB 直結のクラス
make:factory ファクトリ生成 テスト用データ生成

Trait は「コード再利用」を主目的にするため、複数クラスで共通するロジックを持つ場合に選択します。


テスト例(Pest)

<?php

it('creates a trait file', function () {
    $this->artisan('make:trait SampleTrait')
        ->expectsOutput('Trait created successfully.')
        ->assertExitCode(0);

    expect(storage_path('app/Traits/SampleTrait.php'))->toBeFile();
});

トラブルシュート

症状 / エラー 原因 対処
Permission denied 作業ディレクトリに書き込み権限がない sudo で実行、またはディレクトリ権限を変更
Trait already exists 同名ファイルが既存 --force オプションを付与、またはファイル名を変更
Class "App\...Trait" not found 名前空間が解決できない composer dump-autoload でオートローダを再生成

参考リンク


レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする