Dans cette partie nous allons développer la gestion des utilisateurs avec notre api laravel. Rien de bien compliqué. Il nous faut pouvoir créer un utilisateur, le modifier le supprimer également. Commençons donc par créer notre controller.

php artisan make:controller UserController

Le model est crée lors de la mise en place de l’authentification. Nous allons mettre en place un CRUD (Create Read Update Delete) , c’est à dire toute les méthode pour créer, modifier, lister et supprimer notre ressource.

Création d’un utilisateur

Dans notre controller nous allons avoir besoin d’une premiere méthode de création (create) . Elle permettra l’affichage du formulaire de création. Egalement d’une seconde méthode permettant la gestion de l’envoie du formulaire en POST ( store ) . Nous viendrons la compléter plus tard.

# /app/Http/Controllers/UserController.php
public function create()
{
    return view('user.create');
}

public function store(Request $request){

}

Dans un second temps créons la vue, il n’y a pas de commande magique il suffit de créer un dossier user dans resources/views. Donc dans ce dossier, nous ajouterons un fichier blade. create.blade.php. Un simple formulaire HTML sera ajouter, vous pourrez customizer les informations a renseigner.

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

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-6 offset-3">
                <form action="{{ route('user.store') }}" method="post">
                    <div class="form-group">
                        <label for="name">UserName</label>
                        <input type="text" name="name" id="name" class="form-control" required>
                    </div>
                    <div class="form-group">
                        <label for="mail">Email</label>
                        <input type="email" name="email" id="mail" class="form-control" required>
                    </div>
                    <div class="form-group">
                        <label for="password">Password</label>
                        <input type="password" name="password" id="password" class="form-control" required>
                    </div>
                    @csrf()
                    <input type="submit" class="btn btn-success">
                </form>
            </div>
        </div>
    </div>
@endsection

Rien de bien compliqué, il s’agit d’html avec une couche blade. La prochaine étape est de créer la route permettant d’accéder à la méthode du controller ( create ) qui affichera la vue et celle de l’envoie du formulaire ( store )

# /routes/web.php

Route::get('user/create','UserController@create')->name('user.create');
Route::post('user/store','UserController@store')->name('user.store');

La route est crée et vous pouvez dès à présent afficher votre formulaire depuis /user/create

Notre formulaire est simple mais fonctionnel. Passons a présent a l’envoie des données et l’enregistrement pour nos utilisateurs. Reprenons donc la méthode ( store ) de votre controller.

# /app/Http/Controllers/UserController.php

public function store(Request $request)
{
    // verification possible
    User::create($request->all());
    return redirect()->route('user.index');
}

Pour rester simple je n’ai pas fait de vérification mais rien ne vous empêche de le faire. L’objet request contient toute les données envoyer dans le formulaire. la méthode all() va récupérer tous les champs automatiquement, mais si vous préférer les récupérer un part un , il suffit d’utiliser les méthodes magiques ( ex : $request->password ).

User::create() nous permet simplement de créer un utilisateur et on finira par rediriger l’utilisateur vers une route appelé user.index qui listera nos utilisateurs.

Lister les utilisateurs

Pour continuer, dans cette lancé , on va ajouter notre nouvelle route la vue et notre méthode de listing ( index ).

# /app/Http/Controllers/UserController.php

public function index()
{
      $users = User::paginate(5);
      return view('user.index',compact('users'));
}


# /routes/web.php

Route::get('user','UserController@index');

# /resources/user/index.blade.php

@extends('layouts.app')

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

                            <tr>
                                <td>{{$user['name']}}</td>
                                <td>{{$user['email']}}</td>
                                <td>{{$user['created_at']}}</td>
                                <td>
                                   <a class="btn btn-warning" href="#">Modifier</a>
                                </td>
                            </tr>
                            @endforeach
                    </tbody>

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

Info : $users->links() permet d’afficher automatiquement les liens de la pagination crée auparavant. Vous avez a présent une page de création et une page d’affichage. Notre prochaine étape est la création de la page de modification.

Modification d’un utilisateur

Il est bien evident que dans un cas réel nous devons pouvoir modifier les attributs d’un personne inscrite. Dans notre cas nous allons devoir faire deux formulaires. Un pour la modification des informations « basiques » tandis que l’autre servira pour la modification du simple mot de passe. Il est possible dans votre cas de lié ces deux formulaires. Nous commencerons comme a chaque fois par créer deux routes par formulaire, deux templates mais également deux méthodes par formulaire dans notre controller.

#Formulaire 1

#/routes/web.php
Route::get('/user/edit/{user}','UserController@edit')->name('user.edit');
Route::put('/user/edit/{user}','UserController@update')->name('user.update');

# /app/Http/Controller/UserController

public function edit(User $user)
{
    return view('user.edit', compact('user'));
}
public function update(Request $request, User $user)
{
    $user->update($request->all());
    $user->save();
    return redirect()->route('user.index');
}

#/resources/views/user/edit.blade.php

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-6 offset-3">
                <form action="{{ route('user.update',['user' => $user]) }}" method="POST">
                    <div class="form-group">
                        <label for="name">UserName</label>
                        <input type="text" name="name" id="name" class="form-control" required value="{{ $user['name'] }}">
                    </div>
                    <div class="form-group">
                        <label for="mail">Email</label>
                        <input type="email" name="email" id="mail" class="form-control" required value="{{ $user['email'] }}">
                    </div>
                    @method('PUT')
                    @csrf()
                    <input type="submit" class="btn btn-success">
                </form>
            </div>
        </div>
    </div>
@endsection
#Formulaire 2

#/routes/web.php
Route::get('/user/password/{user}','UserController@password')->name('user.password');
Route::put('/user/password/{user}','UserController@password_store')->name('user.password_store');


# /app/Http/Controller/UserController
 public function password(User $user)
    {
        return view('user.password',['user' => $user]);
    }

    public function password_store(Request $request, User $user)
    {
        $password = $request->password;
        $confirm_password = $request->confirm_password;

        if($password === $confirm_password){
            $user->password = Hash::make($password);
            $user->save();
            return redirect()->route('user.index');
        }
        return redirect()->route('user.password',['user' => $user]);
    }

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

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-6 offset-3">
                <form action="{{ route('user.password_store',['user' => $user]) }}" method="post">
                    <div class="form-group">
                        <label for="password">Mot de passe</label>
                        <input type="password" name="password" id="password" class="form-control" required>
                    </div>
                    <div class="form-group">
                        <label for="password">Confirmation de Mot de passe</label>
                        <input type="password" name="confirm_password" id="password" class="form-control" required>
                    </div>
                    @csrf()
                    @method('PUT')
                    <input type="submit" class="btn btn-success">
                </form>
            </div>
        </div>
    </div>
@endsection

Voila la modification d’un utilisateur et terminé. Il faut également savoir que ce code est un code fait pour être le plus simple possible. Par exemple nous devrions vérifier si le mot de passe n’est pas vide, ou encore si les mot de passe ne sont pas égaux alors on aurai pu retourner en arrière en affichant une erreur avec la fonction withErrors et en n’oubliant pas d’ajouter l’affichage de l’erreur dans note layout.blade.php par exemple.

redirect()->back()->withErrors();

Suppression d’un utilisateur

Notre dernière étape est la suppression d’un utilisateur. Dans le meilleur des cas il faudrait demander une confirmation avant la suppression de l’utilisateur, mais cette partie ne m’intéresse pas pour le moment, mais pour aller un peu plus loin vous pouvez jetez un oeil a SweetAlert . Bien continuons, comme a chaque fois une route , une méthode mais cette fois pas de vue. Il n’y a rien a afficher.

#/routes/web.php
Route::delete('/user/{user}','UserController@destroy')->name('user.destroy');


# /app/Http/Controller/UserController
public function destroy(User $user)
{
       $user->delete();
       return redirect()->route('user.index');
}

Et voila on a fini notre crud. Il va rester une dernière étape. Nous n’avons afficher aucun bouton permettant de modifier et supprimer. Dans votre vue de liste , il suffira d’ajouter un simple lien pour la modification du password et des informations « basiques » , en revanche pour la suppression il faudra envoyé un formulaire car la requête est en DELETE. Je vous met en dessous la vue index.blade.php modifié.

#/resources/views/user/index.blade.php

@extends('layouts.app')

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

                            <tr>
                                <td>{{$user['name']}}</td>
                                <td>{{$user['email']}}</td>
                                <td>{{$user['created_at']}}</td>
                                <td>
                                    <div class="row">
                                        <div class="col">
                                            <form action="{{ route('user.destroy',['user' => $user['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('user.password',['user' => $user['id']]) }}" class="btn btn-sm btn-info">Mot de passe</a>
                                        </div>
                                        <div class="col">
                                            <a href="{{ route('user.edit',['user' => $user['id']]) }}" class="btn btn-sm btn-warning">Modifier</a>
                                        </div>

                                    </div>

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

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

Cette fois tout est terminé. Vous avez a présent une gestion d’utilisateur fonctionnelle. Ajouter un lien dans votre layout pour y accéder. Je rappelle encore une fois que ce code est loin d’être parfait. Comme dans les exemples données pour haut il faudrais ajouter des messages de confirmation ou des popups nous indiquant si notre action c’est correctement déroulé. Mais je vous laisse vous amusez avec ça. Dans une prochaine partie nous parlerons de la resource article et des catégories. Je rappelle que nous enregistrerons nos articles dans une base NoSql : ElasticSearch. Cela nous permettra de faire de la recherche avancé.

Je vous laisse vous amusez, n’hésitez pas à poser des questions en commentaires et a me donnez vos avis. De la même façon vos retours sur ce petit tutoriel seront les bienvenues. Et si vous n’avez pas encore installé votre environnement, allez faire un tour ici.

A bientôt.

Show CommentsClose Comments

Leave a comment