LaravelにはModel Eventと言うモデルの状態変更に合わせてコールバックを実行できる機能があります。
最近、この機能を知りました。
その機能を別のシステムでも使おうとした所すんなり動かなかったので備忘録として残しておきます。
あくまで、対処法の一つですので必ず同じケースになるわけではありませんが頭の片隅に残していただければと思います。
環境について
この修正は、Laravel 5.5で開発したシステムを対象にています。
ただし、5.5より上のバージョンでも共通の解決方法かと思います。
修正前コード
元々は下記のようなコードでした。
class Entry extends Model
{
//
public $samples;
public function __construct($value)
{
$this->sampleValue = $value;
}
}
Modelの保存後に特定の処理を実行したいと考えました。
$entry = new Entry()
$entry->save();
そのため、saved イベントを追加しました。
class Entry extends Model
{
// 省略
/**
* Model Event設定
*/
protected static function boot() {
parent::boot();
self::saved(function(Maintenance $maintenance){
dd('saved');
});
}
}
しかし、この状態ではイベントが実行されません。
エラーも発生しないため直接的な問題も見当たりませんでした。
結論
bootで設定したイベント動かすには、Modelクラスのコンストラクタを実行する必要があります。
試した事
キャッシュを周りをクリア
もしかしたら、composerやlaravelのキャッシュが残っている可能性があると思い、下記のコマンドを実行しました。
しかしイベントは実行できませんでした。
$ composer dump-autoload $ php artisan clear-compiled $ php artisan optimize $ php artisan config:cache
親のコンストラクタを実行する
元のコードはモデルの初期値を設定するためにコンストラクタを用意していました。
継承元(Model)のコンストラクタを呼ぶように設定しまいした。
class Entry extends Model
{
//
public $samples;
public function __construct($value)
{
// 親コンストラクタを呼び出す
parent::__construct();
$this->sampleValue = $value;
}
}
このコードを書いた事で、Model Eventを実行できるようになりました。
以上です。
大した問題ではなかったわけですが、実装当時の記憶がほぼない状態でしたので気づくのに時間がかかってしまいました。
もし同じような問題が発生した方がこれを見て早々に解決される事を願っています。