【问题标题】:How to overwrite bulk clone function for laravel backpack如何覆盖 laravel 背包的批量克隆功能
【发布时间】:2021-06-25 21:53:01
【问题描述】:

我正在尝试覆盖批量克隆功能。 我只想克隆一些值,其余的分配一个静态值。例如,我只想克隆名称和描述值,以及我想为其分配当前日期的日期。 而且我不知道该怎么做。

use \Backpack\CRUD\app\Http\Controllers\Operations\BulkCloneOperation { bulkClone as traitBulkClone; }

public function bulkClone($id) {
    // your custom code here
    $this->traitBulkClone($id);
}

【问题讨论】:

  • 你能分享你拥有的任何代码吗?您要覆盖的这种方法是什么?

标签: laravel clone bulk laravel-backpack


【解决方案1】:

TLDR:最有效的方法可能是覆盖模型上的 replicate() 方法。请注意,它不是 Backpack 方法,而是 BulkCloneOperation 用来复制的 Eloquent 方法一个特定的条目。

为什么?

Inside the BulkCloneOperation,你会注意到路由调用了bulkClone() 方法,它本身只是对模型上的replicate() 方法进行了一些调用。这意味着您有两个选项可以覆盖此行为:

(选项 A)。覆盖 CrudController 中的 bulkClone() 方法。这将仅覆盖该特定管理操作上的行为。

(选项 B)。覆盖模型中的replicate() 方法。这样,无论何时(通过您的管理面板或软件的任何其他部分)调用 replicate(),都会按照您指定的方式完成复制。


在大多数情况下,我认为选项 B 更合适,因为它可以避免将来的代码重复。这是 Laravel 目前的 replicate() 方法,如果您问我,只需将其复制粘贴到您的模型中并修改它以适应您的需求是最好的解决方案:

    /**
     * Clone the model into a new, non-existing instance.
     *
     * @param  array|null  $except
     * @return static
     */
    public function replicate(array $except = null)
    {
        $defaults = [
            $this->getKeyName(),
            $this->getCreatedAtColumn(),
            $this->getUpdatedAtColumn(),
        ];

        $attributes = Arr::except(
            $this->getAttributes(), $except ? array_unique(array_merge($except, $defaults)) : $defaults
        );

        return tap(new static, function ($instance) use ($attributes) {
            $instance->setRawAttributes($attributes);

            $instance->setRelations($this->relations);

            $instance->fireModelEvent('replicating', false);
        });
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 2020-05-08
    • 1970-01-01
    • 2015-08-09
    • 2021-03-18
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多