Laravel-excel: [سؤال] بعد حدث الاستيراد

تم إنشاؤها على ٧ ديسمبر ٢٠١٨  ·  24تعليقات  ·  مصدر: Maatwebsite/Laravel-Excel

المتطلبات الأساسية

إصدارات

  • إصدار PHP: 7.2
  • إصدار Laravel: 5.7
  • إصدار الحزمة: 3.1.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);
    }
}
bug

التعليق الأكثر فائدة

سيحتوي الإصدار التالي (حاليًا 3.1-dev) على دعم لأحداث Before / AfterImport للقراءة الجزئية. سيضيف أيضًا حدث ImportFailed الذي يتم رفعه عند فشل أي من الوظائف المقتطعة. (https://twitter.com/patrickbrouwers/status/1114166252711415808)

لا تتردد في اختباره على الفرع 3.1 واسمحوا لي أن أعرف إذا كان يعمل مثل مستثنى.

ال 24 كومينتر

لدي نفس المشكلة. يبدو أن الحدث AfterImport لا يتم إطلاقه أبدًا إذا كنت تنفذ عقد WithChunkReading

يبدو أن هذا ينطبق أيضًا على حدث BeforeImport

لقد ألقيت نظرة سريعة على الكود ولا يمكنني رؤية أي رمز سيؤدي إلى إطلاق هذا الحدث على الإطلاق في فئة ChunkReader.

وعندما أفكر في الأمر لا يوجد حل جيد لذلك. ربما يكون أحد الحلول هو الإعلان عن وظيفة واحدة في السلسلة لرفع طريقة afterImport؟

هل لدينا أجوبة على هذا الموضوع؟ :)

نعم ، لقد حددنا هذا على أنه خطأ. سنرى ما إذا كان بإمكاننا التوصل إلى حل لها في إصدار مستقبلي.

GlennM عند الحديث مع هذا ، أود معرفة ما إذا كانت هناك طريقة أيضًا لتنفيذ حدث BeforeChunk و AfterChunk أيضًا ، لتتمكن من تحديث واجهة الواجهة الأمامية للتقدم أثناء عملها ... أشياء يجب مراعاتها مع هذا ، يجب أن يكون العدد الإجمالي + إجمالي الأجزاء + الجزء الحالي (للأفكار فقط) ، تتم معظم ملفاتي من خلال واجهة المستخدم الرسومية ولكنها كبيرة إلى حد ما ، لذا فإن القدرة على منحهم نوعًا من "أنه قيد التقدم" أفضل من غير محدد شريط التقدم

صوت BeforeChunk و AfterChunk ممكن.

إن BeforeImport / AfterImport أكثر صعوبة. ستؤثر إضافتها في وظيفتين إضافيتين إلى السلسلة على الأداء ، حيث ستؤدي إلى إعادة فتح الملف مرتين. سيكون الخيار الأفضل قادرًا على تنفيذ الاستيراد المسبق فقط في الوظيفة الأولى والاستيراد اللاحق في الوظيفة الأخيرة. سأرى ما إذا كان ذلك ممكنًا.

+1 لإضافة أحداث BeforeImport / AfterImport إلى الوظائف المتقطعة. كنت على وشك تقديم اقتراح لإضافة هاتين الوظيفتين إلى السلسلة ، ولكن يبدو أنك تعمل بالفعل! إن اقتراحك بتنفيذ الأحداث في الوظيفة الأولى والأخيرة يبدو أفضل أيضًا إذا كان ذلك ممكنًا.

لا يعمل AfterImport مع shouldQueue و WithChunkReading.
بالإضافة إلى ذلك ، فهي مطلوبة لقوائم الانتظار ، لذلك لا يتم تنفيذ حدث في نهاية تشغيل قائمة الانتظار.

مع اقتراح التوثيق:

استيراد $-> قائمة انتظار ('users.xlsx') -> سلسلة ([
NotifyUserOfCompletedImport الجديد (طلب () -> المستخدم ()) ،
]) ؛

يتم تشغيل كل عنصر من عناصر قائمة الانتظار في: NotifyUserOfCompletedImport

ألجوما sugestão؟

لقد واجهت نفس المشكلة. تم حلها عن طريق إنشاء مهمة تنفذ shouldQueue ، ثم تشغيل الاستيراد منها وتنفيذ الإجراءات اللازمة (التي ستكون بخلاف ذلك في حدث afterImport) بعد انتهاء الاستيراد. قام الاستيراد بتكوين إدخالات الدُفعات وقراءة المجموعة ويتم تنفيذه بشكل متزامن في المهمة.

تتمثل إحدى مزايا ما سبق في أنه يمكنني التحكم بسهولة في أي عامل في قائمة الانتظار يقوم بتنفيذ المهمة.

وميزة أخرى (مهمة للغاية) هي أنه يمكنني استيراد ملفات XLS مع المهمة في قائمة الانتظار. شيء غير ممكن في حالة استخدام الأسلوب القياسي مع تنفيذ 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. بالنظر إلى طريقة قراءة فئات القارئ ، فليس من الواضح لماذا يتم تشغيل beforeImport في الداخل فقط قبل القراءة بدلاً من إطلاقه بشكل متزامن قبل استدعاء قراءات ChunkReader.

  2. في السيناريو المقسم ، يمكنك ربط مهمة ما للقيام بأي من مهام الإخطار ، ولكن نظرًا لأن خاصية "currentFile" محمية ، فلا يمكنك إجراء تنظيف مناسب للملف المؤقت ولا يتم إجراؤه تلقائيًا - المهمة المقيدة بعد كل عمليات ReadChunk ستكون مفيدة جدًا مع كل من afterImport ومع تنظيف درجة الحرارة.

هل لدينا أي حلول للتعامل مع عمليات الاستيراد الفاشلة؟ الطريقة الوحيدة التي يمكنني التفكير بها حاليًا هي استخدام حدث خطأ وظيفي عالمي لارافيل.

المشكلة في ذلك هي أنه ليس لدي سيطرة على عملية aatwebsiteExcel \ Jobs \ ReadChunk. هذا يعني أنه لا يمكنني تمرير البيانات التي أحتاجها حول الوظيفة الفاشلة للحدث العالمي.

كيف يمكننا معالجة الأخطاء عند استخدام chunkSize؟

سيحتوي الإصدار التالي (حاليًا 3.1-dev) على دعم لأحداث Before / AfterImport للقراءة الجزئية. سيضيف أيضًا حدث ImportFailed الذي يتم رفعه عند فشل أي من الوظائف المقتطعة. (https://twitter.com/patrickbrouwers/status/1114166252711415808)

لا تتردد في اختباره على الفرع 3.1 واسمحوا لي أن أعرف إذا كان يعمل مثل مستثنى.

إذا كنت أستخدم برنامج التشغيل database queue للواردات ونفذت WithChunkReading على صنف الاستيراد الخاص بي ، فإن اللحامات ستؤدي إلى تشغيل حدث AfterImport عدة مرات. هل هذا سلوك متوقع؟

أشهد تشغيل AfterImport مرتين بعد كل عملية استيراد ناجحة ، مع برنامج تشغيل قائمة الانتظار database والإصدار 3.1 .

أنا أعاني من تشغيل AfterImport إلى أجل غير مسمى بعد تشغيل استيراد ناجح أيضًا باستخدام برنامج تشغيل queue database والإصدار 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 التقييمات