Hello, nous sommes maintenant a la phase de construction des catégories. Dans cette partie nous allons parler de la gestion des catégories. Pour ma part j’ai décidé qu’il ne pouvais pas y avoir de suppression. Dans le cas ou vous voudriez le faire, n’oubliez pas de gérer le cas de l’article qui possèderait la catégorie précédemment supprimé. Commençons donc par la mise en place de la table qui stockera les catégories.

Création des fichiers

Demandons a Laravel de faire le boulot a notre place. Il faudra donc utiliser Artisan.

php artisan make:model Categories -mcr

Nous ajoutons les options « m », « c » et « r » . Cela nous permet de créer le fichier de migration et le controller en même temps que le model. Modifions donc notre migration

# /database/migrations/*_create_categories_table.php
public function up()
    {
        Schema::create('categories', function (Blueprint $table) 
        {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('slug')->unique();
            $table->timestamps();
        });
    }

Dans le model, j’ajoute simplement protected $guarded = []; cela permet a tout les attributs d’être modifié.

Création du controller Categories

Côté controller, on part sur la création de nos méthodes de création et de stockage. Petite subtilité, j’ajoute un constructeur pour faire appel au middleware auth.

#/app/Http/Controller/CategorieController.php
public function __construct()
{
        $this->middleware('auth');
}

public function create()
{
        return view('categories.create');
}

public function store(Request $request)
{
        $tmp = [
            'name' => $request->nom,
            'slug' => Str::slug($request->nom)
        ];
        $cat = new Categorie($tmp);
        $cat->save();
        return redirect()->route('categories.index');
}

Rien de bien compliqué. Remarqué que pour créer un slug, j’utilise la méthode magique de Laravel permettant de slugifier une chaine de caractère. On crée une vue create dans un dossier catégories, rien de bien compliqué . On affiche un formulaire simple.

#/resources/views/categories/create.blade.php

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-6 offset-3">
                <form action="{{ route('categories.store') }}" method="post">
                    <div class="form-group">
                        <label for="nom">Nom</label>
                        <input type="text" name="nom" id="nom" class="form-control" required>
                    </div>
                    @csrf()
                    <input type="submit" class="btn btn-success">
                </form>
            </div>
        </div>
    </div>

@endsection

Passons a présent aux routes. Tant que les routes ne sont pas créer il n’y a aucun moyen de voir notre formulaire ni les actions qui lui sont liés. Contrairement à la partie précédente où nous avons défini chaque route une à une, nous allons plutôt utiliser la méthode « resource » de routing. Je vous laisse découvrir son utilité directement sur la documentation officielle très bien faite.

#/routes/web.php

Route::resource('/categories','CategorieController');

En accédant a l’url /categories/create vous obtiendrez votre formulaire et vous pourrez dès a présent ajouter une catégorie. Pour la suite, nous allons nous tourner vers la modification. Comme a chaque fois : méthodes , vues. Pas de route cette fois-ci, car notre méthode resource fait déjà tout le travail.

#/app/Http/Controller/CategorieController.php

public function edit(Categorie $category)
{
    return view('categories.update',['category' => $category]);
}

public function update(Request $request, Categorie $category)
{
    $category->name = $request->nom;
    $category->slug = Str::slug($request->nom);
    $category->save();
    return redirect()->route('categories.index');
}

#/resources/views/categories/update.blade.php

@extends('layouts.app')
@section('content')
    <div class="container">
        <div class="row">
            <div class="col-6 offset-3">
                <form action="{{ route('categories.update',['categorie' => $category['id']]) }}" method="post">
                    <div class="form-group">
                        <label for="nom">Nom</label>
                        <input type="text" name="nom" id="nom" class="form-control" value="{{ $category['name'] }}" required>
                    </div>
                    @method('PUT')
                    @csrf()
                    <input type="submit" class="btn btn-success">
                </form>
            </div>
        </div>
    </div>
@endsection

Listing de nos categories

Dernière chose, la liste de catégorie. On récupère toute les catégories, on les affiches avec une pagination. On ajoute l’action de modification et le bouton de création.

#/app/Http/Controller/CategorieController.php
public function index()
{
   $categories = Categorie::paginate(5);
   return view('categories.index',['categories' => $categories]);
}

#/resources/views/categories/index.blade.php
@extends('layouts.app')
@section('content')
    <div class="container">
        <div class="row">
            <div class="col-2 offset-10">
                <a href="{{ route('categories.create') }}" class="btn btn-info">Création d'une categorie</a>
            </div>
        </div>
        <div class="row">
            <div class="col-8 offset-2">
                <table class="table">
                    <thead>
                    <tr>
                        <th>Nom</th>
                        <th>Crée le</th>
                        <th>Actions</th>
                    </tr>
                    </thead>
                    <tbody>
                    @foreach($categories as $category)

                        <tr>
                            <td>{{$category['name']}}</td>
                            <td>{{$category['created_at']}}</td>
                            <td>
                                <a href="{{ route('categories.edit',['category' => $category['id']]) }}"
                                   class="btn btn-sm btn-warning">Modifier</a>
                            </td>
                        </tr>
                    @endforeach
                    </tbody>

                </table>
                {{ $categories->links() }}
            </div>
        </div>
    </div>
@endsection

Nous avons terminé toute notre gestion et pouvons a présent passer a la suite. Dans une prochaine partie nous parlerons de la gestion des articles. La petite différence dans notre cas sera le stockage de la data. Celle-ci sera en effet, faite dans une base NoSQL : ElasticSearch nous permettant dans le futur d’avoir une indexation sur mesure mais surtout une pertinence lors de notre recherche sur la partie front. Je vous retrouve dans la prochaine partie.

A bientôt

Show CommentsClose Comments

Leave a comment