Laravel中是否有回调,如:
afterSave()
beforeSave()
etc
我搜索但没有发现任何东西。如果没有这样的东西 - 实施它的最佳方法是什么?
谢谢!
答案 0 :(得分:67)
在保存回调之前和之后实现的最佳方式,以扩展 save()
功能。
这是一个简单的例子
class Page extends Eloquent {
public function save(array $options = [])
{
// before save code
parent::save($options);
// after save code
}
}
所以现在当您保存一个Page对象时,会调用 save()
函数,其中包含 parent::save()
函数;
$page = new Page;
$page->title = 'My Title';
$page->save();
答案 1 :(得分: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
});
}
}
答案 2 :(得分: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');
我们如何处理这个问题?只需将它分配给此eventListener示例:
\Laravel\Event::listen('eloquent.saving: User', function($user){
$user->saving();//your event or model function
});
答案 3 :(得分:6)
即使这个问题已经被标记为“已被接受”。 - 我为Laravel 4添加了一个新的更新答案。
Beta 4 of Laravel 4 has just introduced hook events for Eloquent save events - 所以你不再需要扩展核心了:
添加了Model :: creating(Closure)和Model :: updates(Closure)方法,用于挂钩到Eloquent保存事件。感谢Phil Sturgeon最后向我施压......:)
答案 4 :(得分:3)
在Laravel 5.7中,您可以从命令行创建模型观察者,如下所示:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Tab2Map">
<com.google.android.gms.maps.MapView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"/>
</android.support.constraint.ConstraintLayout>
然后在您的app \ AppServiceProvider中,告诉启动方法要观察的模型和观察者的类名。
php artisan make:observer ClientObserver --model=Client
然后在您的app \ Observers \中,您应该找到上面创建的观察者,在本例中为ClientObserver,该观察者已经填充了创建/更新/删除的事件钩子,可用于填充逻辑。我的ClientObserver:
use App\Client;
use App\Observers\ClientObserver;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Client::observe(ClientObserver::class);
}
...
}
我真的很喜欢这种方式的简单性。参考https://laravel.com/docs/5.7/eloquent#events
答案 5 :(得分:0)
如果您想要控制模型本身,可以覆盖保存功能并将代码放在__parent::save()
之前或之后。
否则,每个Eloquent模型在保存之前都会触发一个事件。
当Eloquent保存模型时,还会发生两个事件。
“eloquent.saving:model_name”或“eloquent.saved:model_name”。
答案 6 :(得分:0)
使用afarazit解决方案可能会破坏您的应用程序* 这是固定的工作版本:
注意:saving
或其他事件在您使用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 *我试图编辑他的答案,但是没有用