【发布时间】:2016-10-29 22:00:16
【问题描述】:
我有一个用于属性的 Laravel 应用程序,假设在我的代码中某处:
$property = new Property();
$property->city = "New York";
...
$property->save();
然后我有监听特定事件的事件监听器:
$events->listen(
'eloquent.saved: Properties\\Models\\Property',
'Google\Listeners\SetGeoLocationInfo@fire'
);
最后在SetGeoLocationInfo.php我有
public function fire($event)
{
$property = $event;
...
//get GPS data from Google Maps
$property->latitude = $googleMapsObject->latitude;
$property->longitude = $googleMapsObject->longitude;
$property->save();
}
当我保存模型时进入无限递归,因为在处理程序中引发了save()。
如何更改我的代码以使其在保存后仅填充一次位置数据并避免递归?
我不能使用flushEventListeners(),因为在这种情况下,其他监听器会停止工作(例如附加属性照片)。
【问题讨论】:
-
触发时,使用保存,而不是保存
-
只需覆盖属性中的保存方法 - 传递保存模式的参数。在这样的 fire() 中: $property->save(Property::SAVE_FROM_GOOGLE_FIRE);其他更多的东西。
标签: php laravel events eloquent