2013-02-15 9 views
5

Jestem nowy dla Laravel i ogólnie ORM. W jaki sposób mogę podłączyć się do Eloquent, aby uruchomić kod ognia przed i po zapisie dowolnego modelu? Wiem, że mogę wykonać następujące czynności dla konkretnych modeli, ale szukam pomysłu, jak to zrobić dla każdego modelu.Haczyk w kształcie elfa do Eloquent przed i po zapisaniu dla każdego modelu

class Page extends Eloquent { 

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

chcesz zapisać, że hak który istnieje dla wszystkich modeli rozszerzonych z wymowne? – Bilal

Odpowiedz

3

Można utworzyć klasę BaseModel który rozciąga wymowny i wtedy wszystkie modele przedłużyć BaseModel. Oto przykład:

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

to jest dobry pomysł. dzięki – David

11

Jest jeszcze lepszy sposób na osiągnięcie tego! Załóż obserwatora, powiedzmy, że model o nazwie House:

class HouseObserver { 

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

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

} 

teraz zarejestrować obserwatora z modelem House dodając linię House::observe(new HouseObserver) somehwere. Linia może być dodawany w sposobie bagażnika modelu:

class House extends Eloquent { 

    // Lots of model code 

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

} 

Więcej informacji można znaleźć here.

1

wykorzystaniem modeli laravel właścicielem wydarzenia cyklu życia może rozwiązać ten łatwy

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

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

    static::created(function ($instance){ 
     // 
    }); 
} 
Powiązane problemy