2013-02-15 7 views
5

私はLaravelとORMの方が一般的です。どのようにモデルの保存の前後にコードを実行するために私はEloquentにフックできますか?私は特定のモデルのために私は次のことをすることができますが、私はどのようにすべてのモデルのためにこれを行うかを考えて探しています。laravel hook intoすべてのモデルのための保存前と後の保存

class Page extends Eloquent { 

    public function save() 
    { 
     // before save code 
     parent::save(); 
     // after save code 
    } 
} 
+0

を解決することがありますが雄弁から延長し、すべてのモデルのために存在しているフックを保存することをしたいですか? – Bilal

答えて

3

雄弁を拡張するBaseModelクラスを作成して、すべてのモデルがBaseModelを拡張できるようにすることができます。ここに例があります:

abstract class Elegant extends Eloquent{ 

/* Save ****************************/ 
public function preNew() {} 
public function postNew() {} 
public function preSave() { return true; } 
public function postSave() {} 
public function save($validate=true, $preSave=null, $postSave=null) 
{ 
    $newRecord = !$this->exists; 
    if ($validate) 
     if (!$this->valid()) return false; 
    if($newRecord) 
     $this->preNew(); 

    $before = is_null($preSave) ? $this->preSave() : $preSave($this); 
     // check before & valid, then pass to parent 
    $success = ($before) ? parent::save() : false; 
    if ($success) 
     is_null($postSave) ? $this->postSave() : $postSave($this); 
    if($newRecord) 
     $this->postNew(); 
    return $success; 
} 
public function onForceSave(){} 
public function forceSave($validate=true, $rules=array(), $messages=array(), $onForceSave=null) 
{ 
    if ($validate) 
     $this->valid($rules, $messages); 
    $before = is_null($onForceSave) ? $this->onForceSave() : $onForceSave($this); // execute onForceSave 
    return $before ? parent::save() : false; // save regardless of the result of validation 
} 

/** Soft Delete ****************************/ 
public function preSoftDelete() { return true; } 
public function postSoftDelete() { } 
public function softDelete($val = true, $preSoftDelete=null, $postSoftDelete=null) 
{ 
    if ($this->exists) 
    { 
     $before = is_null($preSoftDelete) ? $this->preSoftDelete() : $preSoftDelete($this); 
     $success = null; 
     if($before) { 
      $this->set_attribute(static::$softDelete, $val); 
      $success = $this->save(false); 
     } 
     else 
      $success = false; 
     if ($success) 
     { 
      is_null($postSoftDelete) ? $this->postSoftDelete() : $postSoftDelete($this); 
     } 
     return $success; 
    } 
} 

/** Hard Delete ****************************/ 
public function preDelete() { return true;} 
public function postDelete(){} 
public function delete($preDelete=null, $postDelete=null) 
{ 
    if ($this->exists) 
    { 
     $before = is_null($preDelete) ? $this->preDelete() : $preDelete($this); 
     $success = ($before) ? parent::delete() : false; 
     if ($success) 
     { 
      is_null($postDelete) ? $this->postDelete() : $postDelete($this); 
     } 
     return $success; 
    } 
} 
} 
+0

これは良いアイデアです。ありがとう – David

11

これを達成するためのさらに良い方法があります。今ラインにHouse::observe(new HouseObserver) somehwereを追加することにより、Houseモデルとオブザーバを登録し

class HouseObserver { 

    public function saving(House $house) { 
     // Code before save 
    } 

    public function saved(House $house) { 
     // Code after save 
    } 

} 

:のためのオブザーバーを作成し、Houseと呼ばれるモデルを言うことができます。ラインは、モデルのブート方法で追加することができます。

class House extends Eloquent { 

    // Lots of model code 

    public static function boot() { 
     parent::boot(); 
     self::observe(new HouseObserver); 
    } 

} 

詳細情報here見つけることができます。 laravelモデルに独自のライフサイクルイベントを使用して

1

は、この簡単

/** 
* model life cycle event listeners 
*/ 
public static function boot(){ 
    parent::boot(); 

    static::creating(function ($instance){ 
     // 
    }); 

    static::created(function ($instance){ 
     // 
    }); 
} 
関連する問題