1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?