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

Orb*_*tum 29 php laravel

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)

  • 你需要在这里非常小心,因为你没有在数据库事务中操作.父::保存(); 完成数据库转换.如果您之前和之后保存,它们也将是完整的交易.如果您需要确保所有保存发生或失败,那么您需要将它们包装在DB :: transaction()中. (3认同)
  • @fico7489 检查是否设置了 `$model->id`。如果是,您正在编辑。 (2认同)

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)

  • 我花了一些时间想知道为什么以上在我的测试中不起作用.这里有一个讨论:https://github.com/laravel/framework/issues/1181.您可以将绑定放在global.php中以解决问题. (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');
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的最佳答案.http://laravel.com/docs/5.0/eloquent#model-events (6认同)

Lau*_*nce 6

即使这个问题已被标记为"已接受" - 我正在为Laravel 4添加一个新的更新答案.

Laravel 4的Beta 4刚刚为Eloquent保存事件引入了钩子事件 - 所以你不再需要扩展核心了:

添加了Model :: creating(Closure)和Model :: updates(Closure)方法,用于挂钩到Eloquent保存事件.感谢Phil Sturgeon最后迫使我这样做...... :)


sas*_*anb 5

在 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