保存后,保存之前的laravel模型回调等

时间:2012-11-22 19:01:17

标签: php laravel

Laravel中是否有回调,如:

afterSave()
beforeSave()
etc

我搜索但没有发现任何东西。如果没有这样的东西 - 实施它的最佳方法是什么?

谢谢!

7 个答案:

答案 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”。

http://laravel.com/docs/events#listening-to-events

答案 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 *我试图编辑他的答案,但是没有用