#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. да, у меня есть запись в таблице неудачных заданий, но как я могу с ней справиться и почему она выдает ошибку проверки там?