Laravel-excel: [问题]汇入活动后

创建于 2018-12-07  ·  24评论  ·  资料来源: Maatwebsite/Laravel-Excel

先决条件

版本号

  • PHP版本:7.2
  • Laravel版本:5.7
  • 套件版本:3.1

描述

我在使导入后事件开始工作时遇到了一些麻烦。 该事件永远不会触发。 :(
后页工作正常,我在做什么错?

我已经尝试了注册事件和自动注册事件。

我的密码

namespace App\Imports;

use App\Order;
use App\Order\Address;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\RegistersEventListeners;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Events\AfterImport;
use Maatwebsite\Excel\Events\BeforeImport;

class OrderAddressImport implements
    WithHeadingRow,
    ToModel,
    WithBatchInserts,
    WithChunkReading,
    WithCustomCsvSettings,
    ShouldQueue,
    WithEvents
{
    use Importable, RegistersEventListeners;

    protected $order;

    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    /**
     * <strong i="16">@param</strong> array $row
     * <strong i="17">@return</strong> Address
     */
    public function model(array $row)
    {
        $data = ['order_id' => $this->order->id];
        $data = array_merge($data, $row);

        return new Address($data);
    }


    public function batchSize() : int
    {
        return 1000;
    }

    public function chunkSize() : int
    {
        return 5000;
    }

    /**
     * <strong i="18">@return</strong> array
     */
    public function getCsvSettings(): array
    {
        return [
            'delimiter' => ';',
            'enclosure' => '',
            'input_encoding' => 'UTF-8'
        ];
    }

    public static function afterImport(AfterImport $event)
    {
       dd($event);
    }
}

最有用的评论

下一版本(当前为3.1-dev)将支持用于块读取的Before / AfterImport事件。 它还将添加ImportFailed事件,该事件在任何块作业失败时引发。 (https://twitter.com/patrickbrouwers/status/1114166252711415808)

随时在3.1分支上对其进行测试,让我知道它是否像例外一样工作。

所有24条评论

我有同样的问题。 如果您要实现WithChunkReading合同,似乎从未触发AfterImport事件。

对于BeforeImport事件似乎也是如此

我快速浏览了一下代码,在ChunkReader类中根本看不到任何会触发此事件的代码。

当我考虑到这一点时,还没有很好的解决方案。 也许一种解决方案是向链中添加单个作业以提高afterImport方法?

我们对此主题有任何答案吗? :)

是的,我们已将其识别为错误。 我们将看看我们是否可以在将来的版本中提出解决方案。

@GlennM谈到这一点,我想看看是否还有一种方法也可以实现BeforeChunk和AfterChunk事件,以便能够在工作进行时更新进度的前端GUI。 ,应该是总数+总块数+当前块数(仅供参考),我的大多数文件都是通过GUI完成的,但相当大,因此能够给它们一些“正在进行中”总比不确定进度条

可以使用BeforeChunk和AfterChunk声音。

BeforeImport / AfterImport比较棘手。 将它们作为2个额外的作业添加到链中,将对性能产生影响,因为它将重新打开文件2倍。 最好的选择是只能在第一个作业上执行beforeimport,在最后一个作业上执行afterimport。 我会看看是否有可能。

+1以将BeforeImport / AfterImport事件添加到块作业中。 我本打算提交一份提案,将其作为两个工作添加到链中,但听起来您已经加入了! 如果可能的话,您关于在第一份工作和最后一份工作中实施事件的建议也听起来最好。

AfterImport不适用于ShouldQueue和WithChunkReading。
另外,它们是队列所必需的,因此不会实现队列运行结束时的事件。

在文档建议下:

$ import->队列('users.xlsx')->链([
新的NotifyUserOfCompletedImport(request()-> user()),
]);

触发每个队列项目:NotifyUserOfCompletedImport

Algumasugestão?

我遇到了同样的问题。 通过创建实现ShouldQueue的Job,然后从中运行Import并在导入完成后执行必要的操作(否则将在afterImport事件中)来解决该问题。 导入已配置了批处理插入和块读取,并在作业中同步执行。

上面的好处之一是,我可以轻松地控制哪个Queue worker正在执行作业。

另一个(非常重要的)好处是我可以使用排队的作业导入XLS文件。 如果使用标准方法在Import类本身中实现ShouldQueue,那是不可能的。

我有同样的问题。。。我该怎么办..请

@ zxl2006001@patrickbrouwers更新的文档我解决了这个逻辑我的问题。

(new UsersImport)->queue('users.xlsx')->chain([
    new NotifyUserOfCompletedImport(request()->user()),
]); 

参见此处: https: //docs.laravel-excel.com/3.1/imports/queued.html#appending -jobs

当前设计实际上还有两个后果:

  1. 查看Reader类的read方法,尚不清楚为什么仅在beforeReading内部触发beforeImport,而不是在调用ChunkReader读取之前同步触发。

  2. 在分块的情况下,您可以链接作业以执行任何通知工作,但是由于保护了“ currentFile”属性,因此您无法对临时文件进行适当的清理,并且该操作不会自动完成-将所有ReadChunk链接在一起的作业对afterImport和临时清理。

我们有任何解决失败的进口的解决方法吗? 我目前能想到的唯一方法是使用laravels全局作业错误事件。

问题是我无法控制aatwebsiteExcel \ Jobs \ ReadChunk进程。 这意味着我无法将有关失败作业的所需数据传递给全局事件。

使用chunkSize时如何处理错误?

下一版本(当前为3.1-dev)将支持用于块读取的Before / AfterImport事件。 它还将添加ImportFailed事件,该事件在任何块作业失败时引发。 (https://twitter.com/patrickbrouwers/status/1114166252711415808)

随时在3.1分支上对其进行测试,让我知道它是否像例外一样工作。

如果我使用database队列驱动程序进行导入,并在导入类上实现WithChunkReading ,则它会多次触发AfterImport事件。 那是预期的行为吗?

我遇到AfterImport $$$$在每次成功导入后被触发两次的情况,其中使用database队列驱动程序和版本3.1

我在使用database队列驱动程序和版本3.1运行成功的导入后遇到无限期触发的AfterImport 3.1

如果我使用redis队列驱动程序进行导入,并在导入类上实现WithChunkReading ,则它会多次触发AfterImport事件。 那是预期的行为吗?

这是错误日志:

local.ERROR: unlink(/Users/sineld/Code/project/public/uploads/tmp/laravel-excel-qfK6O5aCHxhFXioVayQbLQag5UnFKyxB.xlsx): No such file or directory {"exception":"[object] (ErrorException(code: 0):

同样,她的AfterImport被调用了两次。

我还遇到了两次被调用的AfterImport侦听器。 使用xdebug进行调试后,我发现侦听器在两个位置进行了注册:

固定为下一个版本

此页面是否有帮助?
0 / 5 - 0 等级