CodingPHP

Laravel FormRequest

Для вынесения логики проверки входящих данных из контроллера можно воспользоваться классом 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, но об этом в следующий раз.

Оставить комментарий

avatar
  Подписаться  
Уведомление о