2013-02-15 80 views
5

我是新來的Laravel和ORM的一般。我怎麼能夠鉤進雄辯來保存任何模型之前和之後的代碼?我知道我可以爲特定的模型做以下事情,但我正在研究如何爲每個模型做到這一點。laravel勾入雄辯pre和post保存爲每個模型

class Page extends Eloquent { 

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

你想,一個保存鉤子是存在從雄辯擴展所有型號? – Bilal 2013-02-15 21:57:38

回答

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 2013-02-15 22:33:17

11

甚至還有一個完成這更好的辦法!創建一個觀察者,可以說一個模式叫House

class HouseObserver { 

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

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

} 

現在,通過將行House::observe(new HouseObserver) somehwere註冊與House模型的觀察。該行可以在模型的啓動方法中添加:

class House extends Eloquent { 

    // Lots of model code 

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

} 

更多信息可查詢here

1

使用laravel模型自己的生命週期事件可能會解決這個容易

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

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

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