При использовании Laravel 5.1 я пытаюсь создать Observer, который автоматически обновит следующие 3 столбца
Я понимаю, что Eloquent автоматически обновит отметку времени даты (created_by, updated_at, deleted_at), но мне нужно обновить user_id, который внес изменения.
Мне было рекомендовано использовать Observer и черту, чтобы справиться с этим. Вот что я сделал
1) создал класс наблюдателя под названием «ModelSignature», расположенный в app\Observers\ModelSignature.php
и это его содержимое
<?php namespace App\Observers; class ModelSignature { protected $userID; public function __construct(){ $this->userID = Auth::id(); } public function updating($model) { $model->modified_by = $this->userID; } public function creating($model) { $model->created_by = $this->userID; } public function removing($model) { $model->purged_by = $this->userID; } }
Затем я создал новый признак под названием «RecordSignature», расположенный в app\Traits\RecordSignature.php
и содержащий следующий код
<?php namespace App\Traits; use app\Observers\ModelSignature; trait RecordSignature { public static function bootObservantTrait() { static::observe(new ModelSignature() ); } }
Наконец, в моей модели «Учетная запись», расположенной на «app \ Models \ Account.php», я использую ее так:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use App\Models\industry; use App\Traits\RecordSignature; use App\Traits\TrimScalarValues; class Account extends Model { use RecordSignature, TrimScalarValues; /** * The database table used by the model. * * @var string */ protected $table = 'accounts'; protected $primaryKey = 'account_id'; const CREATED_AT = 'created_on'; const UPDATED_AT = 'modified_on'; const REMOVED_AT = 'purged_on'; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = ['client_id','account_name', 'company_code', 'legal_name', 'created_by','modified_by','instrucations']; /** * The attributes excluded from the model's JSON form. * * @var array */ //protected $hidden = ['account_id', 'remember_token']; protected $guarded = ['account_id']; /** * Get the industry record associated with the account. */ public function industry() { return $this->hasOne(industry, industry::primaryKey); } public function pk(){ return $this->primaryKey; } }
Проблема в том, что методы updating()
, removing()
и creating()
не заполняют userId, как ожидалось. Кажется, что поля игнорируются или методы не увольняются!
Что я здесь делаю неправильно?
Вы должны быть в состоянии избавиться от своего класса ModelSignatures и изменить свой признак на что-то вроде:
trait RecordSignature { protected static function boot() { parent::boot(); static::updating(function ($model) { $model->modified_by = \Auth::User()->id; }); static::creating(function ($model) { $model->created_by = \Auth::User()->id; }); //etc } }
Надеюсь это поможет!
Я предлагаю вам использовать ревизионный пакет для венчурного бизнеса с этим обновлением https://github.com/fico7489/laravel-revisionable-upgrade
Все будет работать из коробки, вам просто нужно использовать 2 черты, вы можете сделать гораздо больше, чтобы получить информацию, кто отредактировал модель, вы можете получить информацию, которая отредактировала конкретный столбец, даже особую ценность и многое другое …