35
34

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 5 years have passed since last update.

Laravel5でModelイベントのハンドラを登録する

Posted at

ある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;
35
34
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
35
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?