updateorcreate update delete create php laravel eloquent

php - update - laravel hook en Eloquent pre y post save para cada modelo



updateorcreate laravel (2)

Soy nuevo en Laravel y ORM en general. ¿Cómo podría conectarme a Eloquent para activar el código antes y después de guardar cualquier modelo? Sé que puedo hacer lo siguiente para modelos específicos, pero estoy buscando la forma de hacerlo para cada modelo.

class Page extends Eloquent { public function save() { // before save code parent::save(); // after save code } }


Puede crear una clase BaseModel que se amplíe elocuente y luego hacer que todos sus modelos amplíen BaseModel. Aquí hay un ejemplo:

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; } } }


¡Hay incluso una mejor manera de lograr esto! Crea un observador para, digamos un modelo llamado House :

class HouseObserver { public function saving(House $house) { // Code before save } public function saved(House $house) { // Code after save } }

Ahora registre al observador con el modelo de House agregando la línea House::observe(new HouseObserver) alguna cosa. La línea se puede agregar en el método de arranque del modelo:

class House extends Eloquent { // Lots of model code public static function boot() { parent::boot(); self::observe(new HouseObserver); } }

Más información se puede encontrar aquí .