Help us understand the problem. What is going on with this article?

【Laravel】【PHP】【初心者】Laravelでのトレイトの使い方

違う階層の複数のクラスで、共通化できる処理が存在した場合、トレイトに共通処理を書き出しましょう。

メリット

・クラスの継承と違って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していて、同名のメソッドがあるとエラーが出ます。

hommayade
しろうと
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away