- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Maatwebsite\Excel 包将新用户导入系统。默认包关注 ToModel 不适合我,因为我需要为每个导入的用户分配默认角色并为他/她发送电子邮件。我正在尝试使用 ToCollection 关注点,如本文档页面的最后一章所述:https://docs.laravel-excel.com/3.1/imports/validation.html .问题是我无法正确验证 Excel 文件的内容:根本不会出现错误消息。当我使用 Maatwebsite\Excel 包并且它是 ToCollection 问题时,如何正确验证 Excel 文件的内容?
也许您知道如何为用户设置角色并在导入每个用户后发送电子邮件的不同方法?
<?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',
];
}
}
$validator = Validator::make($rows->toArray(), $this->rules());
if ($validator->fails()) {
return redirect()->route('profile.view_client')
->with('validation_errors', $validator->errors());
}
最佳答案
最后,我自己解决了这个问题:
<?php
class ProfileController extends Controller
{
public function updateClient(UserClientRequest $request)
{
if (!Auth::user()->hasRole('super-admin') && !Auth::user()->hasRole('admin')) {
return redirect()->route('profile');
}
$client = Auth::user()->client;
$client->name = $request->name;
$client->type = $request->type;
$client->save();
$errors = [];
if ($request->hasFile('file_to_import_companies')) {
$companiesImport = new CompaniesImport($client->id);
$companiesImport->import($request->file('file_to_import_companies'));
foreach ($companiesImport->failures() as $failure) {
foreach ($failure->errors() as $error) {
$errors[] = $error;
}
}
}
// this was changed:
if ($request->hasFile('file_to_import_users')) {
$usersImport = new UsersImport($client->id);
$usersImport->import($request->file('file_to_import_users'));
// I made function getErrors on UsersImport class:
$usersValidationErrors = $usersImport->getErrors();
} else {
$usersValidationErrors = [];
}
$errors = array_merge($errors, $usersValidationErrors);
return redirect()->route('profile.view_client')
->with('message', trans('client.updated'))
->with('validation_errors', $errors);
}
}
/* Here is my 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 Maatwebsite\Excel\Validators\Failure;
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;
private $errors = []; // array to accumulate errors
public function __construct($clientId)
{
$this->clientId = $clientId;
}
public function collection(Collection $rows)
{
$rows = $rows->toArray();
// iterating each row and validating it:
foreach ($rows as $key=>$row) {
$validator = Validator::make($row, $this->rules(), $this->validationMessages());
if ($validator->fails()) {
foreach ($validator->errors()->messages() as $messages) {
foreach ($messages as $error) {
// accumulating errors:
$this->errors[] = $error;
}
}
} else {
$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->locale = 'no';
$user->save();
DB::table('model_has_roles')->insert([
'role_id' => 4,
'model_type' => 'App\User',
'model_id' => $user->id
]);
}
}
}
// this function returns all validation errors after import:
public function getErrors()
{
return $this->errors;
}
public function rules(): array
{
return [
'0' => 'required|max:255',
'1' => 'required|max:255',
'2' => 'required|unique:users,email|email|max:255',
];
}
public function validationMessages()
{
return [
'0.required' => trans('user.first_name_is_required'),
'1.required' => trans('user.last_name_is_required'),
'2.required' => trans('user.email_is_required'),
'2.unique' => trans('user.email_must_be_unique'),
'2.email' => trans('user.email_must_be_valid'),
];
}
}
关于php - 当我使用 Maatwebsite\Excel 包并且它是 ToCollection 问题时,如何正确验证 Excel 文件的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56522760/
在laravel-10项目中对EXCEL文件运行“Composer Required maatWebSite/EXCEL”,但显示“Package phpoffice/phpexel is reast
$file = $request->file('excel'); $reader = Excel::load($file->getRealPath())->get(); 出现如下错误: Call to
我正在使用 Laravel 5.4,我想将记录导出到 excel 文件,但出现此错误 传递给 Illuminate\Database\Eloquent\Builder::create() 的参数 1
我是 Laravel 的新手,但我正在使用 Laravel 的 Maatwebsite\Excel Library v3 导出 excel。但是我在导出数组数据时遇到了一些问题。 这是我的代码
如何在 laravel maatwebsite excel 包中更改工作表方向? 我想从左到右改变。 A B C D 至: D C B A 这是我的代码: $row = $this->user
我正在使用 laravel maatwebsite packag e 导出 excel 表。一列包含欧元货币,因此我正在尝试为数据创建一个货币列。 我的列代码: $sheet->setColu
PHP 版本:7.3.9 Laravel 版本:5.8.30 包版本:3.1 描述 我正在尝试导出 excel 文件。我做了文档中的所有事情,并且过程没有错误。但是 excel 文件没有下载。我使用的
我一直在使用Laravel Excel以 csv 格式导出数据,到目前为止效果很好。现在我需要以 xlsx 格式导出,以便可以在某些列中包含下拉列表。我看过this question但看起来那是针对旧
当我尝试在 Ubuntu 的服务器上使用 Maatwebsite 3.1 版本导入 excel 表时,出现此类错误。 Error: Maatwebsite \ Excel \ Exceptions \
我的 composer.json : ... "maatwebsite/excel": "^3.0", ... 我可以在本地主机上运行我的项目,但是当我在服务器上上传时,我收到
我正在尝试安装 maatwebsite/excel ;但是,我无法让它工作。 我尝试删除 composer.lock 文件并运行: composer install composer update 我
我将我的应用程序迁移到 laravel 5.7。在 composer.json 中安装包时,我从“maatwebsite/excel:~2.1.0”升级到“maatwebsite/excel”:“^3
我正在使用 Maatwebsite excel 将数据导出到 Excel。我正在使用 Laravel 框架。我的数组看起来像这样:- Array ( [0] => Array (
我只想获取 Excel 第一列,该列将作为列名称。 我正在使用此代码 Excel::load($request->file, function ($reader) use($request) { $t
我有 4 个 Excel 文件,每个文件包含 1000 行。我将其合并并使其为 4000,这样我可以节省一些时间。但是,如果我导入合并的文件,它会返回错误一般错误:1390 准备好的语句包含太多占位符
我不知道我做错了什么,或者这可能是正常的。我必须加载并“读取”大约 12000 行的 excell。我为此使用了这段代码。 Excel::selectSheetsByIndex(0)->load($p
我正在使用 Maatwebsite 3.1使用 Laravel 5.8。 我生成了一个包含价格列的电子表格,我想对其求和。为此,我有以下代码: data = $data; } publ
我正在使用 Maatwebsite Laravel-Excel 将大型 xlsx 文件导入我的数据库。它工作得很好,但我找不到导入链接到文档中某个单元格的超链接的方法。这些链接始终作为没有附加链接的简
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
在 excel 中,我有 3 个名为 Total 的列, Payment Released , 和 Payment Return .计算Payment Return ,我在其中添加了一个公式,即 =U
我是一名优秀的程序员,十分优秀!