Я написал статью о том, как кешировать бобы 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;
}
}
Этот перехватчик используется в файле конфигурации пружины:
Надеюсь, что это поможет!
На самом деле, 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
});
Если вы хотите контролировать саму модель, вы можете переопределить функцию сохранения и поместить свой код до или после __parent::save()
.
В противном случае происходит событие, запускаемое каждой моделью Eloquent перед тем, как она спасет себя.
Также происходит два события, когда Eloquent сохраняет модель.
«eloquent.saving: имя_модели» или «eloquent.saved: имя_модели».
Добавление в примере для Laravel 4:
class Page extends Eloquent {
public static function boot()
{
parent::boot();
static::creating(function($page)
{
// do stuff
});
static::updating(function($page)
{
// do stuff
});
}
}
Лучший способ добиться обратного вызова до и после сохранения в расширении функции 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();
В 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
Ваше приложение может сломаться, используя решение 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 * Я пытался отредактировать его ответ, но не получилось
Хотя этот вопрос уже помечен как «принятый» - я добавляю новый обновленный ответ для Laravel 4.
В бета-версии 4 Laravel 4 только что появились события ловушек для событий сохранения Eloquent - поэтому вам больше не нужно расширять ядро:
Добавлена модель :: создание (закрытие) ) и Model :: update (Closure) для подключения к событиям сохранения Eloquent. Спасибо Филу Осетрину за то, что он наконец заставил меня сделать это ...:)