Много кто скажет про принципы единой ответственности и т.д., но в этом материале речь не о том как важно делать, но о том как можно. И вот когда дело доходит до валидации запросов Laravel, одним из самых интересных является Request. Рассмотрим к примеру следующий запрос:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class storeCommentRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'who'=>'required|min:2|max:100',
'email'=>'email',
'body'=>'required|min:2|max:1000',
'phone'=>'required|min:2|max:100',
'rating'=>'required|min:1|max:5'
];
}
}
В нем мы разрешаем добавить комментарий для страницы, заполнив поля по указанным правилам. Но, мы ведь его можем и расширить. К примеру:
<?php
namespace App\Http\Requests;
use App\User;
use Illuminate\Foundation\Http\FormRequest;
class storeCommentRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
if (\Auth::guest() && $this->isMethod('POST')){
return [
'who'=>'required|min:2|max:100',
'email'=>'email',
'body'=>'required|min:2|max:1000',
'phone'=>'required|min:2|max:100',
'rating'=>'required|min:1|max:5'
];
}
if (!\Auth::guest() && User::isAdmin() && $this->isMethod('DELETE')){
return [
'id'=>'required|numeric|exists:comments,id',
];
}
}
}
В этом примере мы расширили правила, для того чтобы администратор мог удалить сообщение, система лишь проверила что такой комментарий существует.
Или расширим еще более гибко. Допустим, у нас есть поле для ввода ссылки на профиль, допустим на фейсбуке. А нам нужно проверить что поле или пустое, или содержит правильную ссылку. В этом случае мы должны создать свое правило валидации и его использовать в запросе.
php artisan make:rule FacebookLinkRule
Эта команда создаст файл правила в директории app/Rules/FacebookLinkRule.php. А после меняем его содержимое на следующее:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class FacebookLinkRule implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
//наш обработчик правила, проверяет ссылку на соответвтствие официальной
$fbUrlCheck = '/^(https?:\/\/)?(www\.)?facebook.com\/[a-zA-Z0-9(\.\?)?]/';
if(empty($value) || preg_match($fbUrlCheck, $value) == 1) {
return true;
}
return false;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
//и наше сообщение на вывод. Используете локализацию - не забудьте здесь ее прогнать.
return 'Неправильная ссылка на Facebook';
}
}
Итак, правило создано. Теперь дополним наш Request этим правилом.
<?php
namespace App\Http\Requests;
use App\User;
use Illuminate\Foundation\Http\FormRequest;
use App\Rules\FacebookLinkRule;
class storeCommentRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
if (\Auth::guest() && $this->isMethod('POST')){
return [
'who'=>'required|min:2|max:100',
'email'=>'email',
'body'=>'required|min:2|max:1000',
'phone'=>'required|min:2|max:100',
'rating'=>'required|min:1|max:5',
'fb_link'=>new FacebookLinkRule,
];
}
if (!\Auth::guest() && User::isAdmin() && $this->isMethod('DELETE')){
return [
'id'=>'required|numeric|exists:comments,id',
];
}
}
}
Таким образом наша валидация стала еще гибче. Мы не только расширили одно правило на проверку администратором, но и создали свое правило проверки на поле ввода. Но и это только пример. Это же правило можно расширить еще и на удаление пользователем, авторизированным, своего же комментария или его обновления. Достаточно только добавить соответствующий обработчик.
Отзывы
Пока нет комментариев
Для того чтобы оставить комментарий, авторизуйтесь.