ids = $ids; $this->fields = $this->fields(); $this->user = user(); } public function title(): string { return Str::snake((new \ReflectionClass($this))->getShortName()); } public function fields(): array { return []; } public function map($model): array { $map = []; $date_fields = ['paid_at', 'invoiced_at', 'billed_at', 'due_at', 'issued_at', 'transferred_at']; $evil_chars = ['=', '+', '-', '@']; foreach ($this->fields as $field) { $value = $model->$field; // created_by is equal to the owner id. Therefore, the value in export is owner email. if ($field == 'created_by') { $value = $model->owner->email ?? null; } if (in_array($field, $date_fields)) { $value = ExcelDate::PHPToExcel(Date::parse($value)->format('Y-m-d')); } // Prevent CSV injection https://security.stackexchange.com/a/190848 if (Str::startsWith($value, $evil_chars)) { $value = "'" . $value; } $map[] = $value; } return $map; } public function headings(): array { event(new HeadingsPreparing($this)); return $this->fields; } public function prepareRows($rows) { event(new RowsPreparing($this, $rows)); return $rows; } public function preferredLocale() { return $this->user->locale; } public function failed(\Throwable $exception): void { $this->user->notify(new ExportFailed($exception->getMessage())); } }