Я новичок в Laravel и ORM в целом. Как я могу подключить Eloquent к коду огня до и после сохранения любой модели? Я знаю, что могу сделать следующее для определенных моделей, но я смотрю на то, как это сделать для каждой модели.
class Page extends Eloquent { public function save() { // before save code parent::save(); // after save code } }
Вы можете создать класс 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; } } }
Есть даже лучший способ сделать это! Создайте наблюдателя, скажем, модель под названием House
:
class HouseObserver { public function saving(House $house) { // Code before save } public function saved(House $house) { // Code after save } }
Теперь зарегистрируйте наблюдателя в модели House
, добавив строку House::observe(new HouseObserver)
. Строку можно добавить в методе загрузки модели:
class House extends Eloquent { // Lots of model code public static function boot() { parent::boot(); self::observe(new HouseObserver); } }
Более подробную информацию можно найти здесь .