Laravel Artisan コマンド:make:trait
何に使うか(TL;DR)
- 目的:Trait(共通ロジックをまとめる再利用可能なコードブロック)を自動生成
- 最低限の使い方:
php artisan make:trait Logger - よくある罠
- 既存ファイルがあると失敗する
- デフォルトで
App\Traits名前空間になる --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 でオートローダを再生成 |

