【问题标题】:Laravel: how to create a function After or Before save|updateLaravel:如何在保存|更新之后或之前创建函数
【发布时间】:2016-12-05 17:13:25
【问题描述】:

我需要生成一个函数在 save() 或 update() 之后或之前调用,但我不知道该怎么做。 我想我需要从 save() update() 回调,但我不知道该怎么做。 谢谢

【问题讨论】:

标签: laravel save updates


【解决方案1】:

这仅在您的模型发生事件后才有效。

方法一,使用观察者

为您的模型创建观察者

php artisan make:observer UserObserver --model=User

这将在您的模型上创建一个事件观察器

class UserObserver
{
    /**
     * Handle the User "created" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        //
    }

    /**
     * Handle the User "deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function deleted(User $user)
    {
        //
    }

    /**
     * Handle the User "forceDeleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function forceDeleted(User $user)
    {
        //
    }
}

您必须在您的服务提供者之一的引导方法中注册此观察者,最好是 AppServiceProvider

// App\Providers\AppServiceProvider.php

public function boot()
{
    User::observe(UserObserver::class);
}

方法2,使用闭包

您可以在模型的静态启动方法中注册自定义事件

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();
        static::created(function ($user) {
            //
        });
    }
}

可用的可观察事件

// Illuminate\Database\Eloquent\Concerns

/**
 * Get the observable event names.
 *
 * @return array
 */
public function getObservableEvents()
{
    return array_merge(
        [
            'retrieved', 'creating', 'created', 'updating', 'updated',
            'saving', 'saved', 'restoring', 'restored', 'replicating',
            'deleting', 'deleted', 'forceDeleted', 'trashed'
        ],
        $this->observables
    );
}

来自 Laravel 文档的注释

当通过 Eloquent 发布批量更新时,保存、保存、更新和更新模型事件不会为更新的模型触发。这是因为在发布大规模更新时从未真正检索到模型。

【讨论】:

    【解决方案2】:

    使用此命令创建提供程序

    php artisan make:provider ProviderClassName
    

    然后在启动函数中定义模型的回调

    Model::created(function($model){
      //Do you want to do
    });
    

    可用回调列表:

    Model::creating(function($model){});
    Model::updated(function($model){});
    Model::updating(function($model){});
    Model::deleted(function($model){});
    Model::deleting(function($model){});
    Model::saving(function($model){});
    Model::saved(function($model){});
    

    【讨论】:

    • 还有 Saving() 和 saved()
    • 不需要全新的ServiceProvider,可以使用AppServiceProvider进行应用定制。
    • 把这个函数加入注册函数而不是启动有什么区别?
    • 还有retrieved()restoring()restored()replicating()forceDeleted()
    【解决方案3】:

    在您的模型中,您可以添加一个 boot() 方法来管理这些事件。

    例如,拥有 User.php 模型:

    class User extends Model 
    {
    
        public static function boot()
        {
            parent::boot();
    
            self::creating(function($model){
                // ... code here
            });
    
            self::created(function($model){
                // ... code here
            });
    
            self::updating(function($model){
                // ... code here
            });
    
            self::updated(function($model){
                // ... code here
            });
    
            self::deleting(function($model){
                // ... code here
            });
    
            self::deleted(function($model){
                // ... code here
            });
        }
    
    }
    

    您可以在这里查看所有可用的事件:https://laravel.com/docs/5.2/eloquent#events

    【讨论】:

    • 请注意:“当通过 Eloquent 发布大规模更新时,已保存和更新的模型事件将不会为更新的模型触发。这是因为在发布大规模更新时从未真正检索到模型。 " laravel.com/docs/5.8/eloquent#events
    • 你说得对。这仅在运行单个请求时,在处理批处理时,我建议循环处理批处理,以防您需要触发这些事件。
    • 一个快速有用的附加说明@MauroCasas:您最好使用引导方法而不是引导。此方法代表这种特定情况,并在 boot() 之后立即调用。这样做,你不需要调用 parent::boot()
    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2011-02-11
    • 2011-01-10
    • 2019-07-02
    • 1970-01-01
    • 2015-06-27
    • 2017-04-13
    相关资源
    最近更新 更多