Подтвердить что ты не робот

Обратные вызовы модели laravel после сохранения, перед сохранением и т.д.

Есть ли в Laravel обратные вызовы, такие как:

afterSave()
beforeSave()
etc

Я искал, но ничего не нашел. Если таких вещей нет - как лучше это реализовать?

Спасибо!

4b9b3361

Ответ 1

На самом деле, у Laravel есть реальный обратный вызов до | после сохранения | обновления | создать некоторую модель. проверьте это:

https://github.com/laravel/laravel/blob/3.0/laravel/database/eloquent/model.php#L362

EventListener, как сохраненный и сохраняющий, являются реальными обратными вызовами

$this->fire_event('saving'); 

$this->fire_event('saved');

как мы можем работать с этим? просто назначьте его этому примеру eventListener:

 \Laravel\Event::listen('eloquent.saving: User', function($user){
  $user->saving();//your event or model function
});

Ответ 2

Лучший способ добиться обратных вызовов до и после сохранения в расширении функции save().

Вот быстрый пример

class Page extends Eloquent {

   public function save(array $options = [])
   {
      // before save code 
      parent::save($options);
      // after save code
   }
}

Так что теперь, когда вы сохраняете объект Page, save() функция save() которая включает функцию parent::save();

$page = new Page;
$page->title = 'My Title';
$page->save();

Ответ 3

Добавление в пример для Laravel 4:

class Page extends Eloquent {

    public static function boot()
    {
        parent::boot();

        static::creating(function($page)
        {
            // do stuff
        });

        static::updating(function($page)
        {
            // do stuff
        });
    }

}

Ответ 4

Даже если этот вопрос уже отмечен "принят" - я добавляю новый обновленный ответ для Laravel 4.

Beta 4 из Laravel 4 только что представил события крюка для событий Eloquent save - вам больше не нужно расширять ядро:

Добавлены методы Model:: creation (Closure) и Model:: update (Closure) для подключения к событиям Eloquent save. Спасибо Фил Стерджон за то, что он окончательно надавил на меня...:)

Ответ 5

В Laravel 5.7 вы можете создать наблюдателя модели из командной строки следующим образом:

php artisan make:observer ClientObserver --model=Client

Затем в вашем app\AppServiceProvider сообщите загрузочному методу модель для наблюдения и имя класса наблюдателя.

use App\Client;
use App\Observers\ClientObserver;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
   {
        Client::observe(ClientObserver::class);
   }
   ...
}

Затем в вашем приложении\Observers\вы должны найти наблюдателя, которого вы создали выше, в данном случае ClientObserver, уже заполненного созданными/обновленными/удаленными хуками событий, чтобы вы могли заполнить их логикой. Мой ClientObserver:

namespace App\Observers;

use App\Client;

class ClientObserver
{

    public function created(Client $client)
    {
        // do your after-model-creation logic here
    }
    ...
}

Мне очень нравится простота этого способа сделать это. Ссылка https://laravel.com/docs/5.7/eloquent#events

Ответ 6

Если вы хотите управлять самой моделью, вы можете переопределить функцию сохранения и поместить свой код до или после __parent::save().

В противном случае происходит событие, инициированное каждой моделью Eloquent, прежде чем оно сэкономит.

Есть также два события, когда Eloquent сохраняет модель.

"eloquent.saving: model_name" или "eloquent.saved: model_name".

http://laravel.com/docs/events#listening-to-events

Ответ 7

Ваше приложение может сломаться с помощью решения afarazit * Вот исправленная рабочая версия:

ПРИМЕЧАНИЕ: saving или любое другое событие не будет работать, если вы используете eloquent вне laravel, если только вам не требуется пакет событий и загрузка событий. Это решение будет работать всегда.

class Page extends Eloquent {

   public function save(array $options = [])
   {
      // before save code 
      $result = parent::save($options); // returns boolean
      // after save code
      return $result; // do not ignore it eloquent calculates this value and returns this, not just to ignore

   }
}

Так что теперь, когда вы сохраняете объект Page, save() функция save() которая включает функцию parent::save();

$page = new Page;
$page->title = 'My Title';
if($page->save()){
  echo 'Page saved';
}

afarazit * Я пытался отредактировать его ответ, но не получилось