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

Я написал статью о том, как кешировать бобы JSF с помощью Spring AOP.

Я создаю простой MethodInterceptor, который перехватывает все методы, аннотированные специальной аннотацией:

public class CacheAdvice implements MethodInterceptor {

private static Logger logger = LoggerFactory.getLogger(CacheAdvice.class);

@Autowired
private CacheService cacheService;

@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {

    String key = methodInvocation.getThis() + methodInvocation.getMethod().getName();

    String thread = Thread.currentThread().getName();

    Object cachedValue = cacheService.getData(thread , key);

    if (cachedValue == null){
        cachedValue = methodInvocation.proceed();
        cacheService.cacheData(thread , key , cachedValue);
        logger.debug("Cache miss " + thread + " " + key);
    }
    else{
        logger.debug("Cached hit " + thread + " " + key);
    }
    return cachedValue;
}


public CacheService getCacheService() {
    return cacheService;
}
public void setCacheService(CacheService cacheService) {
    this.cacheService = cacheService;
}

}

Этот перехватчик используется в файле конфигурации пружины:

    
    
        
            
                
            
            
        
    
    
        
    

Надеюсь, что это поможет!

29
задан ImAtWar 22 October 2018 в 15:45
поделиться

7 ответов

На самом деле, 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
});
8
ответ дан Rao 22 October 2018 в 15:45
поделиться

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

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

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

«eloquent.saving: имя_модели» или «eloquent.saved: имя_модели».

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

0
ответ дан crynobone 22 October 2018 в 15:45
поделиться

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

class Page extends Eloquent {

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

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

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

}
23
ответ дан Nicodemuz 22 October 2018 в 15:45
поделиться

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

Вот краткий пример

class Page extends Eloquent {

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

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

$page = new Page;
$page->title = 'My Title';
$page->save();
67
ответ дан Daan 22 October 2018 в 15:45
поделиться

В 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

3
ответ дан saswanb 22 October 2018 в 15:45
поделиться

Ваше приложение может сломаться, используя решение 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() , которая включает функцию parent::save() ;

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

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

0
ответ дан safrazik 22 October 2018 в 15:45
поделиться

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

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

Добавлена ​​модель :: создание (закрытие) ) и Model :: update (Closure) для подключения к событиям сохранения Eloquent. Спасибо Филу Осетрину за то, что он наконец заставил меня сделать это ...:)

6
ответ дан Laurence 22 October 2018 в 15:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: