Добавление новых категорий
В 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