Я добавил метод к одной из своих моделей:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    public static function boot()
    {
        parent::boot();

        static::created(function ($model) {
            //log $model or maybe do something more complex here
        });
    }
}

И я хочу распространить то же поведение на многие другие модели. Скопировать вставку этого элемента кажется хорошей идеей, потому что если что-то изменится, я не хочу менять это в разных местах. Как лучше всего написать это только один раз и получить одинаковое поведение для нескольких моделей?

0
user1985273 27 Ноя 2017 в 22:34

1 ответ

Лучший ответ

Для этого созданы черты характера. Напишите один раз и используйте на всех классах.

Создайте трейт в app / Traits / MyTraitName.php

<?php

namespace App\Traits;

use Carbon\Carbon;

trait MyTraitName
{

    public function someName() {
        // TO DO;
    }

}

А затем просто импортируйте его поверх любого класса модели, например User:

<?php 

namespace App;

use App\Traits\MyTraitName;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable, MyTraitName;

 ..............

Разница между расширением класса и созданием трейта заключается в том, что когда вы создаете трейт, эта функция уже написана и автоматически используется одинаково для каждой модели, а расширение из некоторого базового класса лучше, если эта функция не будет то же самое для каждой модели.

2
lewis4u 27 Ноя 2017 в 19:49