Laravel有回调吗:
afterSave()
beforeSave()
etc
Run Code Online (Sandbox Code Playgroud)
我搜索但没有发现任何东西 如果没有这样的东西 - 实施它的最佳方法是什么?
谢谢!
afa*_*zit 68
保存回调之前和之后实现扩展save()
功能的最佳方法.
这是一个简单的例子
class Page extends Eloquent {
public function save(array $options = [])
{
// before save code
parent::save($options);
// after save code
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在当你保存一个Page对象时,它的save()
函数被调用,包括parent::save()
函数;
$page = new Page;
$page->title = 'My Title';
$page->save();
Run Code Online (Sandbox Code Playgroud)
Nic*_*muz 23
添加Laravel 4的示例:
class Page extends Eloquent {
public static function boot()
{
parent::boot();
static::creating(function($page)
{
// do stuff
});
static::updating(function($page)
{
// do stuff
});
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
实际上,在保存|更新|创建一些模型之后,Laravel之前有真正的回调.检查一下:
https://github.com/laravel/laravel/blob/3.0/laravel/database/eloquent/model.php#L362
像保存和保存的EventListener是真正的回调
$this->fire_event('saving');
$this->fire_event('saved');
Run Code Online (Sandbox Code Playgroud)
我们该如何处理?只需将它分配给此eventListener示例:
\Laravel\Event::listen('eloquent.saving: User', function($user){
$user->saving();//your event or model function
});
Run Code Online (Sandbox Code Playgroud)
即使这个问题已被标记为"已接受" - 我正在为Laravel 4添加一个新的更新答案.
Laravel 4的Beta 4刚刚为Eloquent保存事件引入了钩子事件 - 所以你不再需要扩展核心了:
添加了Model :: creating(Closure)和Model :: updates(Closure)方法,用于挂钩到Eloquent保存事件.感谢Phil Sturgeon最后迫使我这样做...... :)
在 Laravel 5.7 中,您可以像这样从命令行创建模型观察者:
php artisan make:observer ClientObserver --model=Client
Run Code Online (Sandbox Code Playgroud)
然后在你的 app\AppServiceProvider 中告诉 boot 方法要观察的模型和观察者的类名。
use App\Client;
use App\Observers\ClientObserver;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Client::observe(ClientObserver::class);
}
...
}
Run Code Online (Sandbox Code Playgroud)
然后在您的 app\Observers\ 中,您应该找到您在上面创建的观察者,在本例中为 ClientObserver,已经填充了创建/更新/删除的事件挂钩供您填充您的逻辑。我的客户观察者:
namespace App\Observers;
use App\Client;
class ClientObserver
{
public function created(Client $client)
{
// do your after-model-creation logic here
}
...
}
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢这种做法的简单性。参考https://laravel.com/docs/5.7/eloquent#events