Есть такая таблица
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->string('description')->nullable();
});
name – обязательное
slug – необязательное на фронте, но должно быть заполнено при сохранении модели
Создан реквест и обработка ввода перед валидацией
class StoreRequest extends FormRequest {
public function rules(): array {
return [
'role.name' => 'required',
'role.slug' => ['required', Rule::unique(Role::class, 'slug')],
'role.description' => 'string|max:255|nullable',
];
}
protected function prepareForValidation() {
if (!$this->input('role.slug')) {
$role = $this->input('role');
Arr::set($role, 'slug', Str::slug($this->input('role.name')));
$this->merge([
'role' => $role,
]);
}
}
}
Технически всё работает, но есть вопросы.
Первый вопрос.
Имена полей в форме имеют вид
name="role[name]"
,
name="role[slug]"
, то есть на бэк прилетают в виде массива
roles
в реквесте.
Есть ли какой-то более красивый способ объединения входных данных в
prepareForValidation
, без вытаскивания массива, его изменения и мержа? То есть напрямую изменить одно поле в массиве входящих данных?
Что-то типа такого:
$this->merge([
'role.slug' => Str::slug($this->input('role.name')),
]);
Дот-нотация, увы, не работает, создаётся новый ключ
[
'_token' => '',
'role' => [
'name' => '',
'slug' => '',
]
'role.slug' => '',
]
Второй вопрос.
Мы изменили входящие данные, и, допустим, не сработало правило уникальности на slug.
Получаем на фронте следующее:
То есть в
old('role.slug')
отсутствует то значение, которое мы вставили в
prepareForValidation
Как его туда прокинуть?