Осваиваю Laravel и пытаюсь выработать для себя удобный способ валидации форм. Хочется, чтобы правила были написаны для каждой модели только один раз и можно было удобно обращаться к этим правилам из контроллера. Сделал ниже приведенным способом, оно работает, но я не уверен, что это красиво и оптимально. Может Laravel как обычно может предложить, что-то более простое и красивое для подобного?
Модель:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
const STATUS_DISABLE = 0;
const STATUS_ENABLE = 10;
// Разрешенные поля, необходимо при использовании create($request->all()).
protected $fillable = ['title', 'slug', 'description', 'parent_id', 'status'];
// Правила валидации.
public static function rules() {
return [
'title' => 'required|max:32',
'slug' => 'required|unique:categories|max:32',
'parent_id' => 'required|integer',
'status' => 'required|integer|in:' . implode(',', array_keys(self::getStatusesExisting())),
'description' => 'max:255',
];
}
// Массив статусов.
public static function getStatusesExisting() {
return [
self::STATUS_DISABLE => 'Отключена',
self::STATUS_ENABLE => 'Активна'
];
}
// Дочерняя категория.
public function children() {
return $this->hasMany(self::class, 'parent_id');
}
}
Котроллер:
namespace App\Http\Controllers\Backend;
use App\Models\Category;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class CategoryController extends Controller
{
...
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
// Валидация.
$request->validate(Category::rules());
// Запись.
Category::create($request->all());
// Возврат к списку.
return redirect()->route('backend.category.index');
}
...
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Category $category
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Category $category)
{
// Валидация.
$request->validate(Category::rules());
// Обновление.
$category->update($request->all());
// Возврат к списку.
return redirect()->route('backend.category.index');
}
...
}