Я пытаюсь импортировать новых пользователей в систему, используя пакет Maatwebsite \ Excel. Забота о пакете по умолчанию ToModel мне не подходит, потому что мне нужно назначить роль по умолчанию для каждого импортированного пользователя и отправить ему электронное письмо. Я пытаюсь использовать проблему ToCollection, как описано в последней главе этой страницы документации: https://docs.laravel -excel.com / 3.1 / import / validation.html . Проблема в том, что я не могу правильно проверить содержимое файла Excel: сообщения об ошибках вообще не отображаются. Как правильно проверить содержимое файла Excel, если я использую пакет Maatwebsite \ Excel и это касается ToCollection?
Может быть, вы знаете разные подходы, как установить роль для пользователя и отправлять электронную почту после импорта каждого пользователя?
<?php
/* My controller and action which calls import of users: */
/* used namespaces go here */
class ProfileController extends Controller
{
public function updateClient(UserClientRequest $request)
{
/* Client entity is being updated here, instead of this comment */
// here I try to import users from *.xls file:
$errors = [];
if ($request->hasFile('file_to_import_users')) {
$usersImport = new UsersImport($client->id);
$usersImport->import($request->file('file_to_import_users'));
foreach ($usersImport->failures() as $failure) {
foreach ($failure->errors() as $error) {
$errors[] = $error;
}
}
}
return redirect()->route('profile.view_client')
->with('message', trans('client.updated'))
->with('validation_errors', $errors);
}
}
/* My current UsersImport class: */
namespace App\Imports;
use App\User;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\SkipsFailures;
use Maatwebsite\Excel\Concerns\SkipsOnFailure;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class UsersImport implements WithValidation, SkipsOnFailure, ToCollection
{
use Importable, SkipsFailures;
private $clientId;
public function __construct($clientId)
{
$this->clientId = $clientId;
}
public function collection(Collection $rows)
{
/* this does not work properly: */
Validator::make($rows->toArray(), $this->rules())->validate();
/* maybe I need to do something like this: */
if ($validator->fails()) {
return redirect()->route('profile.view_client')->with('validation_errors', $validator);
}
foreach ($rows as $row) {
$user = new User();
$user->first_name = $row[0];
$user->last_name = $row[1];
$user->email = $row[2];
$user->password = Hash::make(Str::random(16));
$user->client_id = $this->clientId;
$user->save();
DB::table('model_has_roles')->insert([
'role_id' => 4,
'model_type' => 'App\User',
'model_id' => $user->id
]);
}
}
public function rules(): array
{
return [
'*.0' => 'required|max:255',
'*.1' => 'required|max:255',
'*.2' => 'required|unique:users,email|email|max:255',
];
}
}
Редактировать: этот вопрос был помечен как «возможный дубликат», но я сомневаюсь в этом. Я пытался написать такой код в классе UsersImport, метод сбора:
$validator = Validator::make($rows->toArray(), $this->rules());
if ($validator->fails()) {
return redirect()->route('profile.view_client')
->with('validation_errors', $validator->errors());
}
И это не работает вообще. Я думаю, что знаю, как писать валидаторы на Laravel, и я ожидаю, что где-то допустил очень простую ошибку.