Для вынесения логики проверки входящих данных из контроллера можно воспользоваться классом FormRequest.
Создадим его с помощью $ php artisan make:request NameModelRequest
:
vagrant@homestead:~/projects/laravel_store$ php artisan make:request CategoryRequest Request created successfully. vagrant@homestead:~/projects/laravel_store$
Для указания необходимости использования созданного класса внедрим зависимость в контроллер с помощью сервис-контейнера Laravel, указав тип CategoryRequest для переменной $request в сигнатурах методов store() и update():
... /** * Store a newly created resource in storage. * * @param CategoryRequest $request * @return RedirectResponse */ public function store(CategoryRequest $request): RedirectResponse { ...
Теперь можно перенести правила валидации и проверку полномочий пользователя на выполнение операций (вызов методов store() и update()) в CategoryRequest@rules. Для реализации вариабельности валидации уникальных полей добавим небольшой костыль - проверку на store/update по наличию в запросе экземпляра модели.
Сравним методы контроллера до чистки:
<?php namespace App\Http\Controllers; use App\{Category, Product}; use Exception as ExceptionAlias; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; class CategoryController extends Controller { ... /** * Store a newly created resource in storage. * * @return RedirectResponse */ public function store(): RedirectResponse { abort_if( auth()->user()->cannot('create_categories'), 403); request()->validate([ 'name' => 'required|string|max:255|unique:categories,name', 'title' => 'nullable|string|max:255', 'slug' => 'nullable|string|max:255', 'description' => 'nullable|string|max:65535', 'imagepath' => 'nullable|string|max:255', 'parent_id' => 'required|integer|max:255', 'sort_order' => 'required|string|max:1', ]); $category = Category::create([ 'name' => request('name'), 'title' => request('title'), 'slug' => request('slug'), 'description' => request('description'), 'imagepath' => request('imagepath'), 'parent_id' => request('parent_id'), 'sort_order' => request('sort_order'), ]); return redirect()->route('categories.adminindex'); } ... /** * Update the specified resource in storage. * * @param Category $category * @return RedirectResponse */ public function update(Category $category): RedirectResponse { abort_if( auth()->user()->cannot('edit_categories'), 403); request()->validate([ 'name' => 'required|string|max:255|unique:categories,name,'.$category->id.',id', 'title' => 'nullable|string|max:255', 'slug' => 'nullable|string|max:255', 'description' => 'nullable|string|max:65535', 'imagepath' => 'nullable|string|max:255', 'parent_id' => 'required|integer|max:255', 'sort_order' => 'required|string|max:1', ]); $category->update([ 'name' => request('name'), 'slug' => request('slug'), 'title' => request('title'), 'description' => request('description'), 'imagepath' => request('imagepath'), 'parent_id' => request('parent_id'), 'sort_order' => request('sort_order'), ]); return redirect()->route('categories.adminindex'); } ... }
и после:
<?php namespace App\Http\Controllers; use App\{Category, Http\Requests\CategoryRequest, Product}; use Exception as ExceptionAlias; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; class CategoryController extends Controller { ... /** * Store a newly created resource in storage. * * @param CategoryRequest $request * @return RedirectResponse */ public function store(CategoryRequest $request): RedirectResponse { Category::create($request->validated())); return redirect()->route('categories.adminindex'); } ... /** * Update the specified resource in storage. * * @param CategoryRequest $request * @param Category $category * @return RedirectResponse */ public function update(CategoryRequest $request, Category $category): RedirectResponse { $category->update($request->validated()); return redirect()->route('categories.adminindex'); } ... }
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class CategoryRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize(): bool { if ( isset( $this->category ) ) { return auth()->user()->can('edit_categories'); } return auth()->user()->can('create_categories'); } /** * Get the validation rules that apply to the request. * * @return array */ public function rules(): array { return [ 'name' => [ 'required', 'string', 'max:255', isset( $this->category ) ? 'unique:categories,name,'.$this->category->id.',id' : 'unique:categories,name', ], 'title' => 'nullable|string|max:255', 'slug' => 'nullable|string|max:255', 'description' => 'nullable|string|max:65535', 'imagepath' => 'nullable|string|max:255', 'parent_id' => 'required|integer|max:255', 'sort_order' => 'required|string|max:1', ]; } }
И это не всё, для чего можно использовать класс FormRequest, но об этом в следующий раз.
Оставить комментарий