あるModelのアイテムを削除したときに関連Modelも削除したり、ストレージのデータを削除したりしたいことがある。
Laravel5のModelには以下のようにイベントが定義されている。
vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
public function getObservableEvents()
{
return array_merge(
array(
'creating', 'created', 'updating', 'updated',
'deleting', 'deleted', 'saving', 'saved',
'restoring', 'restored',
),
$this->observables
);
}
それぞれのイベントにハンドラを登録するときは以下のように各モデルのbootメソッドで実装。
app/Models/Sample.php
class Sample extends Model
{
protected $table = 'samples';
protected static function boot()
{
parent::boot();
self::updating(function($sample){
return $sample->onUpdatingHandler();
});
self::deleted(function($sample){
$sample->onDeletedHandler();
});
}
private function onUpdatingHandler()
{
//update時刻を記録したり何かする
return true; //キャンセルしたいときはfalseを返す
}
private function onDeletedHandler()
{
//ストレージデータを削除したり関連Modelを削除したりする
}
}
updatingやdeletingなどのing系イベントはfalseを返すとキャンセルされる。
vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
if ($this->fireModelEvent('deleting') === false) return false;