Hello, nous voici dans la 5ème étape de la construction de notre api. Comme a chaque fois nous allons parler de la gestion de resource particulière. Dans le cas, par exemple, ou nous voudrions gérer la description, le titre de la page d’accueil ou encore notre page a propos. Il y a une méthode assez simple pour gérer ces cas simple mais unique. Pour ce faire nous allons utiliser la technique de clé/valeur. Rien de bien compliqué, une clé est unique et elle correspond a une donnée précise par exemple : ACCUEIL_DESCRIPTION. Pour commencer créons notre ressource, j’ai décidé de l’appeler Option.

Création des options

Premièrement la création des fichiers, commande habituelle

php artisan make:model Option -mcr

Notre migration ne vas contenir que deux attributs une clé une valeur.

#/database/migrations/create_options_table
public function up()
    {
        Schema::create('options', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('key')->unique();
            $table->text('value');
            $table->timestamps();
        });
    }

Lancez la migration et le tour est joué

php artisan migrate

On passe à la création de notre formulaire, des méthodes et des routes.

#/routes/web.php
Route::resource('/options','OptionController');

#/app/Http/Controller/OptionController

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

public function store(Request $request)
{
    Option::create($request->all());
    return redirect()->route('options.index');
}

#/resources/views/options/create.blade.php
@extends('layouts.app')

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

Modification d’une option

#/app/Http/Controller/OptionController
public function edit(Option $option)
{
    return view('options.edit',compact('option'));
}

public function update(Request $request, Option $option)
{
    $option->key = $request->key;
    $option->value = $request->value;
    $option->save();
    return redirect()->route('options.index');
}

#/resources/views/options/edit.blade.php
@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-6 offset-3">
                <form action="{{ route('options.update',['option' => $option['id']]) }}" method="post">
                    <div class="form-group">
                        <label for="key">Clé</label>
                        <input type="text" name="key" id="key" value="{{ $option['key'] }}" class="form-control" required>
                    </div>
                    <div class="form-group">
                        <label for="value">Valeur</label>
                        <input type="text" name="value" id="value" value="{{ $option['value'] }}" class="form-control" required>
                    </div>
                    @csrf()
                    @method('PUT')
                    <input type="submit" class="btn btn-success">
                </form>
            </div>
        </div>
    </div>
@endsection

Rien de bien compliqué. On ne réinvente pas la roue et on reprend le même principe qu’a chaque fois.

Suppression d’une option

#/app/Http/Controller/OptionController
public function destroy(Option $option)
{
    $option->delete();
    return redirect()->route('options.index');
}

Liste des options

Pour terminer, nous devons afficher une liste simple de toute nos options pour pouvoir modifier ou encore supprimer nos éléments.

#/app/Http/Controller/OptionController
public function index()
{
    $options = Option::paginate(10);
    return view('options.index',compact('options'));
}

#/resources/views/options/index.blade.php
@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-2 offset-10">
                <a href="{{ route('options.create') }}" class="btn btn-info">Création d'une option</a>
            </div>
        </div>
        <div class="row">
            <div class="col-8 offset-2">
                <table class="table">
                    <thead>
                    <tr>
                        <th>Nom</th>
                        <th>Email</th>
                        <th>Actions</th>
                    </tr>
                    </thead>
                    <tbody>
                    @foreach($options as $opt)

                        <tr>
                            <td>{{$opt['key']}}</td>
                            <td>{{ substr($opt['value'],0,255) }}</td>
                            <td>
                                <div class="row">
                                    <div class="col">
                                        <form action="{{ route('options.destroy',['option' => $opt['id']]) }}" method="POST">
                                            @method('DELETE')
                                            @csrf()
                                            <input type="submit" class="btn btn-sm btn-danger" value="Supprimer">
                                        </form>
                                    </div>
                                    <div class="col">
                                        <a href="{{ route('options.edit',['option' => $opt['id']]) }}" class="btn btn-sm btn-warning">Modifier</a>
                                    </div>

                                </div>

                            </td>
                        </tr>
                    @endforeach
                    </tbody>

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

Et voila nous avons fait le tour. Tout est enfin prêt pour gérer correctement tout votre contenu. Si je récapitule, nous avons une gestion d’article, une gestion d’utilisateur, des catégories pour classer vos articles, des options pour le reste du contenu. Nous sommes a présent prêt pour l’étape suivante. Jusqu’a maintenant nous nous sommes intéressé a notre fameux dashboard permettant de créer toute ce dont nous avions besoin. Il s’agit maintenant d’exposer ces données. Une partie du travail est déjà fait puisque ElasticSearch possède une interface API native. Nous y reviendrons dans un prochain billet.

A bientôt.

Show CommentsClose Comments

Leave a comment