2013-02-15 26 views
5

मैं सामान्य रूप से लैरवेल और ओआरएम के लिए नया हूं। किसी भी मॉडल की बचत से पहले और बाद में मैं कोड को आग लगाना कैसे कर सकता हूं? मुझे पता है कि मैं विशिष्ट मॉडलों के लिए निम्नलिखित कर सकता हूं लेकिन मैं यह पता लगाने के लिए देख रहा हूं कि प्रत्येक मॉडल के लिए यह कैसे करें।लार्वेल हुक एलोक्वेन्ट प्री और पोस्ट में प्रत्येक मॉडल के लिए सहेजें

class Page extends Eloquent { 

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

है आपको लगता है कि एक हुक जो वाक्पटु से बढ़ाया सभी मॉडलों के लिए मौजूद है को बचाने के लिए चाहते हैं का समाधान हो सकता? – Bilal

उत्तर

3

आप बेसमोडेल क्लास बना सकते हैं जो वाक्प्रचार बढ़ाता है और फिर आपके सभी मॉडल बेसमोडेल का विस्तार करते हैं। यहां एक उदाहरण दिया गया है:

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 कहा जाता है:

class HouseObserver { 

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

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

} 

अब somehwere लाइन House::observe(new HouseObserver) जोड़कर 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){ 
     // 
    }); 
}