Laravelでコントローラから別のコントローラのメソッドを使う|共通処理のメソッドはTraitにする

Laravel

LaravelでArticleController と PostController の2つのコントローラがあるとします。

PostControllerには、getContentというメソッドがあるとします。

ArticleControllerでgetContentメソッドを使うことはできるのでしょうか?

いちおう、できはします。でも良くないコードなのでおすすめしません。

class PostController
{
  ...
  public function getContent()
  {
    ...
  }
}

こうします。

appヘルパにPostControllerのパスを文字列で渡せば使えるようです。

class ArticleController
{
  ...
  public function index()
  {
    app(App\Http\Controllers\PostController::class)->getContent();
  }
}

できるけど良くないです。

複数のControllerで共通するメソッドはTraitを使いましょう。

これはLaravelの機能ではなく、PHPの標準機能ですね。

トレイト – Manual – PHP

 

php artisan make: traitとかはできません。コマンドで作れたら楽なんですけどね。

以下のパスに普通に手動でファイルを作りましょう。

app/traits/Content.php

trait Content {

    public function getContent() {
      ...
    }
}

あとはController側でTraitを使うだけです。

使い方はクラス内でuseします。

use App\Traits\Content;

class ArticleController
{
  use Content;
  ...
  public function index()
  {
    $this->getContent();
  }
}

もう1つのコントローラもこうです。

use App\Traits\Content;

class PostController
{
  use Content;
  ...
  public function index()
  {
    $this->getContent();
  }
}

 

Traitは複数のクラスで共通メソッドを使う場合にLaravelではなくとも使うものです。

覚えておくといいとおもます。