ldc-laravel-base-project/app/Traits/Controllers/MultipartModel.php
2024-03-25 09:55:33 +01:00

78 lines
3 KiB
PHP

<?php
namespace App\Traits\Controllers;
use App\Http\Requests\Bo\UpdateMultiplePartsRequest;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
trait MultipartModel
{
/**
* Update the specified resource in storage.
*
* @param \App\Http\Requests\Bo\UpdateMultiplePartsRequest $request
* @param \Illuminate\Database\Eloquent\Model $model
* @param \Illuminate\Foundation\Http\FormRequest $formRequest
* @param string $routeName
* @param string $name
* @param string $successMessage
* @param string $errorMessage
* @return \Illuminate\Http\RedirectResponse
*/
protected function saveModelMultipart(
UpdateMultiplePartsRequest $request,
Model $model,
FormRequest $formRequest,
string $routeName,
string $name,
string $successMessage,
string $errorMessage
): \Illuminate\Http\RedirectResponse {
$fields = [];
$fields['step'] = intval($request->step) + 1;
foreach ($model->parts[intval($request->step)] as $field) {
$fields[$field] = $request->{$field};
}
Cache::set($name, \array_merge(Cache::get($name) ?? [], $fields));
if (intval($request->step) < count($model->parts) - 1) {
return redirect()->route($routeName, $model);
}
return DB::transaction(function () use (
$model,
$formRequest,
$routeName,
$name,
$successMessage,
$errorMessage
) {
$formRequest->prepareForValidation();
$validator = Validator::make(
collect(Cache::get($name))->except('step')->toArray(),
$formRequest->rules()
);
if (count($validator->errors())) {
foreach ($model->parts as $key => $part) {
if (array_search($validator->errors()->keys()[0], $part)) {
$fields['step'] = $key;
Cache::set($name, \array_replace_recursive(Cache::get($name) ?? [], $fields));
break;
}
}
return redirect()->route($routeName, $model)->withErrors($validator->errors());
}
$model->fill($validator->validated());
Cache::forget($name);
if ($model->saveOrFail()) {
$tableName = $model->getTable();
return redirect()->route("bo.$tableName.edit", $model)
->with('success', $successMessage);
}
return redirect()->route($routeName, $model)
->with('error', $errorMessage);
});
}
}