Добавление новых категорий
В app/Http/Controllers/Admin/CategoryController.php в методе create пропишем:
public function create() { return view('admin.categories.create'); }
Создадим вид resources/views/admin/categories/create.blade.php с содержимым:
@extends('admin.layouts.layout'); @section('content') <form action="{{ route('categories.store') }}" method="post"> @csrf <div class="card-body"> <div class="form-group"> <label for="title">Категория</label> <input type="text" class="form-control @error('title') is-invalid @enderror" id="title" placeholder="Название" autocomplete="off" name="title"> </div> <div class="card-footer"> <button type="submit" class="btn btn-primary">Создать</button> </div> </div> </form> @endsection
В app/Models/Category.php добавим свойство fillable. Оно разрешает заполнять указанные поля.
protected $fillable = ['title'];
В app/Http/Controllers/Admin/CategoryController.php в метод store (сохранение нашей категории) добавим валидацию и сообщение об успешно добавленной категории:
public function store(Request $request) { $request->validate([ 'title' => 'required', ]); Category::create($request->all()); // $request->session()->flash('success', 'Категория добавлена!'); // flash message return redirect()->route('categories.index')->with('success', 'Категория добавлена!'); // similarly flash message }
Показ ошибок валидации
В resources/views/admin/layouts/layout.blade.php в .content-wrapper добавим:
<div class="content-wrapper mb-2"> @if ($errors->any()) <div class="alert alert-danger"> <ul class="list-unstyled"> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif @if (session()->has('success')) <div class="alert alert-success"> <ul class="list-unstyled"> {{ session('success') }} </ul> </div> @endif
Всё. Создание новых категорий должно работать.
Валидация в отдельном файле
В консоли выполним команду:
php artisan make:request StoreCategory
Должен создастся файл app/Http/Requests/StoreCategory.php . В нем два метода authorize и rules. Метод authorize проверяет, авторизован ли пользователь. Изменим его:
public function authorize() { return true; }
А rules — это как раз правила валидации формы. В нем мы можем записать нашу валидацию:
public function rules() { return [ 'title' => 'required', ]; }
В файле app/Http/Controllers/Admin/CategoryController.php изменим метод store :
public function store(StoreCategory $request) { Category::create($request->all()); return redirect()->route('categories.index')->with('success', 'Категория добавлена!'); }
Получаем ту же валидацию, что и была.
Редактирование категорий
В app/Http/Controllers/Admin/CategoryController.php редактируем метод edit :
public function edit($id) { $category = Category::find($id); return view('admin.categories.edit', compact('category')); }
Создадим файл resources/views/admin/categories/edit.blade.php .
@extends('admin.layouts.layout'); @section('content') <!-- Content Header (Page header) --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>Редактирование категории "{{ $category->title }}"</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><a href="#">Главная</a></li> <li class="breadcrumb-item active">Редактирование категории</li> </ol> </div> </div> </div><!-- /.container-fluid --> </section> <!-- Main content --> <section class="content"> <form action="{{ route('categories.update', ['category' => $category->id]) }}" method="post"> @csrf @method('PUT') <div class="card-body"> <div class="form-group"> <label for="title">Категория</label> <input type="text" class="form-control @error('title') is-invalid @enderror" id="title" value="{{ $category->title }}" autocomplete="off" name="title"> </div> <div class="card-footer"> <button type="submit" class="btn btn-primary">Изменить</button> </div> </div> </form> </section> <!-- /.content --> @endsection
Метод update
В app/Http/Controllers/Admin/CategoryController.php в метод update добавим:
public function update(Request $request, $id) { $request->validate([ 'title' => 'required', ]); $category = Category::find($id); //$category->slug = null; // чтобы изменялся слаг при редактировании $category->update($request->all()); return redirect()->route('categories.index')->with('success', 'Категория изменена!'); }
Удаление категории
В app/Http/Controllers/Admin/CategoryController.php редактируем метод destroy :
public function destroy($id) { $category = Category::find($id); if ($category->posts->count()) { return redirect()->route('categories.index')->with('error', 'У этой категории есть записи. Сначало удалите их!'); } //Category::destroy($id); $category->delete(); return redirect()->route('categories.index')->with('success', 'Категория удалена!'); }
В resources/views/admin/layouts/layout.blade.php добавим вывод сообщения об ошибках:
@if (session()->has('error')) <div class="alert alert-danger"> <ul class="list-unstyled"> {{ session('error') }} </ul> </div> @endif