Ошибка импорта веб-сайта Laravel и обработка исключений

#php #excel #laravel #maatwebsite-excel

#php #excel #laravel #веб-сайт maatwebsite-excel

Вопрос:

Я пытаюсь использовать веб-сайт maatwebsite для импорта файла Excel в мою систему, я использую Collection с очередью для выполнения этого импорта, поскольку у меня есть связь с другой таблицей, импорт работает, но я не могу получить ошибки, если они произошли это мой код модели импорта

 <?php
namespace AppModels;

use MaatwebsiteExcelConcernsRegistersEventListeners;

use IlluminateSupportCollection;
use MaatwebsiteExcelConcernsWithEvents;
use MaatwebsiteExcelConcernsWithHeadingRow;
use MaatwebsiteExcelEventsBeforeSheet;
use ModulesUserCategoryEntitiesUserCategory;
use MaatwebsiteExcelConcernsToCollection;

use IlluminateSupportFacadesValidator;

use MaatwebsiteExcelConcernsImportable;
use MaatwebsiteExcelConcernsWithValidation;

use MaatwebsiteExcelConcernsWithChunkReading;
use IlluminateContractsQueueShouldQueue;
use AppNotificationsImportHasFailedNotification;

use Hash;
use Log;
use Mail;
use Session;
class Import_Users implements ToCollection, WithHeadingRow, WithEvents,WithValidation,WithChunkReading,ShouldQueue
{
    use RegistersEventListeners,Importable;
public function rules(): array
    {
        return [
         '*.email'=>['email','unique:users,email']

        ];
    }



    public function collection(Collection $rows)
    {
        Validator::make($rows->toArray(), [
            '*.namess' => 'required',
            '*.email'=>['email','unique:users,email'],
        ])->validate();

        foreach ($rows as $row)
        {     $this->validationFields($row);
            $password = rand(11111111, 99999999);
            $pass=Hash::make($password);
            $time = strtotime($row['date_of_birth']);
           $newformat = date('Y-m-d', $time);
            if(isset($row['user_categories']))
                $Cates=$row['user_categories'];
            else
                $Cates='';
            $array = explode(',', $Cates);
            $cateable_array=$this->Handlecategory($array);


            $nums = [];
            $selected=false;
            $correct_order = [];
            $maping = array();
            $this->count = count($row);
            $count = count($row);
            $map_array = array();
            $questions = [];
            $sheet=$this->sheet_name;

            $this->set_role(  $sheet );

                $user = User::create([


                    'name' => $row['name'],
                    'first_name' => $row['first_name'],
                    'last_name' => $row['last_name'],
                    'email' => $row['email'],
                    'gender' => $row['gender'],
                    'date_of_birth' => $newformat,

                    'password' => $pass,
                    'password_confirmation' => 1,


                ]);

                $user->userCategory()->attach($cateable_array);
                $user->syncRoles($this->role);



            if ($this->session_toggle==='true') {
            $this->SendEmailusers($user,$password);

           }
        }
    }
 

Я использую проверку, но проверка, похоже, не работает и не выдает мне никаких ошибок.
вот как я вызываю класс импорта в моем контроллере

  public function import_xlsx(Request $request)
    {
        $i = 0;
        $j = 0;
        $module_title = $this->module_title;
        $module_name = $this->module_name;
        $module_path = $this->module_path;
        $module_icon = $this->module_icon;
        $module_model = $this->module_model;
        $module_action = 'import Excel';
        $module_name_singular = Str::singular($module_name);
        $import_file = Session::get('Excel_file_users');
        $send_mail_toggle = Session::get('Import_user_send_email');

        $data = [];
        $import = new Import_Users();
        $msg = 'Users Added To the Queue ,will inform You when it finish ';
        // $import_file= '/upload/Import/sheet.xls';
        Log::info('session from controller' . $send_mail_toggle);

 try {
     $result = Excel::import($import, storage_path($import_file))->chain([

         new NotifyUserImportComplete(request()->user()),
     ]);

 }
 catch (Exception $e){
     Log::info('exception');

 }
 catch ( ValidationException $e ){

  Log::info("fffffffffffffffffffffffffffffff");
 }
        Flash::success("<i class='fas fa-check'></i> " .$msg)->important();


        return redirect("admin/$module_name");
    }
 

Ответ №1:

Вы должны регистрировать ошибку и / или перепрошивать ее в сеансе, как вы делаете сообщение об успешном завершении

 catch (Exception $e){
    Log::error($e->getMessage());
    return back("admin/$module_name")->withErrors($e->getMessage());
}
 

Комментарии:

1. спасибо за ответ, на самом деле это должно работать, но ничего не происходит, я использую очередь, как я уже сказал, очередь не может перехватить исключение?

2. Ваша очередь запущена? Вы смотрели в таблице заданий? Что находится в очереди только для завершения NotifyUserImportComplete?

3. да, это работает, но данные не вставляются, поскольку я пытаюсь вставить не уникальное электронное письмо, поэтому оно должно выдавать исключение или выдавать ошибку, но оно ничего не делает, с другой стороны, если я пытаюсь вставить уникальное электронное письмо, оно вставляется без проблем

4. таблица заданий @NetcomAsk для успешного действия с вашей очередью и таблица failed_jobs для проверки ошибки, которую вы получили из очереди.

5. да, у меня есть запись в таблице неудачных заданий, но как я могу с ней справиться и почему она выдает ошибку проверки там?