Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 04.09.2019 07:32:20

Как правильно организовать валидацию

Есть пользователи (User), которые могут создавать организации (Organizatoin) - поля name, inn, kpp.
Для формы и записи есть два маршрута
Route::get('pa/organization/add', 'OrganizationController@add')->name('organization-add');
Route::post('pa/organization/add', 'OrganizationController@store')->name('organization-store');

Внутри метода store - простенький валидатор
       $validator = $this->validate($request,[
        'inn' => 'required|min:10|max:12',
        'kpp' => 'max:9',
        'name' => 'required|min:5'
        ]);
После которого - создание сущности Organizatoin (также проверяется, нет ли уже такой организации по inn+kpp).

Теперь задача - привязать организации к пользователю, который ее создает.
Добавил таблицу UserOrganizations (id, id_user, id_organization), а также составной индекс id_user + id_organization

Перед записью проверяем наличие такой записи
$user_org = UserOrganizations::select()->where('user_id', Auth::id())->where('organization_id', $org->id)->first();
if ($user_org!==null){
//уже есть
}

При этом нужно добавить ошибку в стандартный массив errors и сделать redirect, чтобы на предыдущей странице выдать ошибку "К вам уже привязана эта организация" (через @errors)
Как это сделать? Создавать UserOrganizationController и там создавать свою валидацию, или можно как то попроще через стандартный validate? Или вообще не через validate можно добавить произвольный error?

Не в сети

#2 04.09.2019 07:43:42

Re: Как правильно организовать валидацию

Можно сделать так. На предыдущей странице вставляешь код

@if(session('status'))
	<div class="alert alert-success alert-dismissable">
		<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
		{{session('status')}}
	</div>
@endif

В контроллере

if ($user_org!==null){
return redirect()->back()->with('status', __('message.error'));
}

В папке lang делаешь папку ru, в ней файл - message. В нем

return [
'error' => 'Выводимый текст',
];

Не в сети

#3 04.09.2019 08:11:49

Re: Как правильно организовать валидацию

Круто.
Сделал вот так, совсем просто получилось.
        if ($user_org!==null){
            return redirect()->back()->withErrors(['name' => 'У Вас в списке уже есть организация с таким ИНН, КПП'])->withInput();
        }

Только кажется, что проверять предварительно через обращение к модели - немного костыльно
$user_org = UserOrganizations::select()->where('user_id', Auth::id())->where('organization_id', $org->id)->first();

Может есть способ в UserOrganizations (или еще где) реализовать валидацию на составной индекс, а затем внутри метода store (OrganizationController) использовать этот валидатор?

Не в сети

#4 04.09.2019 08:16:20

Re: Как правильно организовать валидацию

Можешь проверять на наличие в БД так

       $validator = $this->validate($request,[
        '$user_org' => 'required|unique:(таблица в БД)',

        ]);

Не в сети

Подвал раздела