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