違う階層の複数のクラスで、共通化できる処理が存在した場合、トレイトに共通処理を書き出しましょう。
##メリット
・クラスの継承と違って1つのクラスで複数のトレイトを使用できる
・上記も含め継承よりも簡単に共通処理をまとめられる+修正できる
トレイトに書き出してあることで、修正する際も共通処理の意識を持って(他に影響がないか確認して)、修正できるという面もあるかと思います。
##使い方
たとえば、下記のようなメソッドがあっちのサービスにもこっちのサービスにもあった場合。
HogeHogeService.php
private function sendMailForUser(int $id)
{
$user = User::findUser($id);
$address = $user->mail_address;
Mail::send(['text' => 'mail'], '', function($email) use ($address) {
$email
->from('hoge@hogehoge.jp')
->to($address)
->subject('あれの件について');
});
}
下記のようなトレイトを作成し、
App\Traits\SendMailTrait.php
<?php
namespace App\Traits;
use Illuminate\Support\Facades\Mail;
Trait SendMailTrait
{
public function sendMailForUser(int $id)
{
$user = User::findUser($id);
$address = $user->mail_address;
Mail::send(['text' => 'mail'], '', function($email) use ($address) {
$email
->from('hoge@hogehoge.jp')
->to($address)
->subject('あれの件について');
});
}
}
HogeHogeService.php
use App\Traits\SendMailTrait;
class HogeHoge
{
use SendMailTrait;
}
これをメソッドを使用していたクラスでuseしてしまえば、あとは
$this->sendMailForUser($id)
で使用できます。とっても簡単。
共通処理化したら、元あったメソッドは忘れず消しましょう。
クラスに同名のメソッドがあると、クラスのメソッドが優先されます。
ちなみにトレイトを複数useしていて、同名のメソッドがあるとエラーが出ます。