Команда make:request
Команда make:request создаёт новый класс запроса в директории app/Http/Requests. Классы запросов служат для централизованной валидации данных, поступающих от клиента. В таком классе можно определить правила валидации, сообщения об ошибках и разрешения на выполнение действия. Это помогает вынести логику проверки из контроллеров, делая код чище и более поддерживаемым.
Команда принимает один обязательный параметр - имя класса запроса. По соглашению имена классов запросов обычно заканчиваются на Request, например, StorePostRequest или UpdateUserRequest. После создания класса вы можете определить в нём методы authorize и rules для управления доступом и правилами валидации соответственно.
Синтаксис
php artisan make:request NameRequest
Пример
Создадим класс запроса для валидации данных при создании новой статьи:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
'status' => 'sometimes|in:draft,published'
];
}
}
?>
Теперь подключим созданный класс в контроллере для автоматической валидации входящего запроса:
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StorePostRequest;
use App\Models\Post;
use Illuminate\Http\JsonResponse;
class PostController extends Controller
{
public function store(StorePostRequest $request): JsonResponse
{
$validated = $request->validated();
$post = Post::create($validated);
return response()->json([
'message' => 'Post created successfully',
'post' => $post
], 201);
}
}
?>
Пример
Создадим запрос с кастомными сообщениями об ошибках:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateUserRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()->id === (int) $this->route('id');
}
public function rules(): array
{
return [
'name' => 'required|string|max:100',
'email' => 'required|email|unique:users,email,' . $this->route('id'),
'password' => 'nullable|string|min:8|confirmed'
];
}
public function messages(): array
{
return [
'name.required' => 'The name field is required.',
'email.required' => 'The email address is required.',
'email.email' => 'Please provide a valid email address.',
'email.unique' => 'This email is already taken.',
'password.min' => 'The password must be at least 8 characters.'
];
}
}
?>
Используем созданный класс в контроллере с явной проверкой данных:
<?php
namespace App\Http\Controllers;
use App\Http\Requests\UpdateUserRequest;
use App\Models\User;
use Illuminate\Http\JsonResponse;
class UserController extends Controller
{
public function update(UpdateUserRequest $request, int $id): JsonResponse
{
$data = $request->validated();
$user = User::findOrFail($id);
$user->update($data);
return response()->json([
'message' => 'User updated successfully',
'user' => $user
]);
}
}
?>
Пример
Создадим класс запроса с дополнительным методом для подготовки данных перед валидацией:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class SearchRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'query' => 'required|string|min:3|max:50',
'per_page' => 'integer|min:1|max:100'
];
}
public function prepareForValidation(): void
{
$this->merge([
'query' => trim($this->query)
]);
}
public function attributes(): array
{
return [
'query' => 'search term',
'per_page' => 'items per page'
];
}
}
?>
Теперь применим запрос в контроллере для поиска по модели:
<?php
namespace App\Http\Controllers;
use App\Http\Requests\SearchRequest;
use App\Models\Post;
use Illuminate\Http\JsonResponse;
class SearchController extends Controller
{
public function search(SearchRequest $request): JsonResponse
{
$query = $request->input('query');
$perPage = $request->input('per_page', 10);
$posts = Post::where('title', 'like', '%' . $query . '%')
->orWhere('content', 'like', '%' . $query . '%')
->paginate($perPage);
return response()->json([
'query' => $query,
'results' => $posts
]);
}
}
?>
Результат выполнения кода при успешном поиске:
{
"query": "laravel",
"results": {
"current_page": 1,
"data": [
{"id": 1, "title": "Getting started with Laravel"},
{"id": 3, "title": "Advanced Laravel techniques"}
]
}
}
Смотрите также
-
команда
make:controller,
которая создаёт новый контроллер -
команда
make:model,
которая создаёт новую модель Eloquent -
команда
make:middleware,
которая создаёт новый middleware -
команда
make:resource,
которая создаёт новый класс ресурса API