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の標準機能ですね。
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ではなくとも使うものです。
覚えておくといいとおもます。