Comprendre Les Models Laravel
Comprendre Les Models Laravel
Comprendre Les Models Laravel
Dans cette partie nous allons parler des modèles qui vous permettent de gérer
vos data dans la base de données. En effet, Laravel inclut Eloquent, un mappeur
objet-relationnel (ORM) qui rend agréable l’interaction avec votre base de
données. Lorsque vous utilisez Eloquent dans Laravel, chaque table de base de
données a un « modèle » correspondant qui est utilisé pour interagir avec cette
table.
Parallèlement à cela, il y a ce que l’on appelle les relations entre vos modèles. En
effet, une table peut être liée à une autre. Une fois que votre application se
complexifie, vous allez alors avoir plusieurs tables qui seront liées entre elles selon
ce que fait votre application. Une table » commande » sera liée à la table
« produits « , une table » client » sera liée à une table » commandes « , mais aussi
une table » factures » elle-même liée à la table » commandes « . Vous voyez
l’idée ?
Prenons comme exemple le cas d’une application de Blog simple fait avec
Laravel Nous allons voir les migrations correspondantes pour l’exemple et surtout
les modèles ainsi que les relations qui permettent de gérer un blog simple.
hasMany : Cette relation indique qu’un enregistrement dans la table A peut être
associé à plusieurs enregistrements dans la table B. La relation hasMany peut être
décrite comme une association de type 1:n. Par exemple :
Un article de blog peut avoir plusieurs commentaires.
Pour mieux comprendre la différence entre les deux dernières relations hasMany
et belongsTo. on peut schématiser les choses de la manière suivante :
Le code pour comprendre les relations entre les modèles dans Laravel
Comme je vous l’ai dit dans l’introduction de cet article, pour illustrer tout ce que
nous venons de voir, je vais illustrer ces différentes relations avec les modèles
via un exemple de blog simple. Dans notre mini blog, il y a donc des articles,
des commentaires sur les articles et enfin des auteurs qui écrivent des
articles et des commentaires. On commence comme d’habitude par créer le
cadre qu’il nous faut pour cela. Dans votre projet Laravel, vous pouvez donc créer
les 3 migrations suivantes :
Comprendre les migrations dans Laravel pour créer les tables de sa base
de données
Normalement, si vous êtes arrivés ici, c’est que vous connaissez déjà un peu les
migrations. On va maintenant remplir les 3 migrations que nous venons de créer
avec le contenu qui va suivre.
La migration create_articles_table :
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class create_articles_table extends Migration
$table->id();
$table->string('title');
$table->text('body');
$table->timestamps();
});
Schema::dropIfExists('articles');
La migration create_authors_table :
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
$table->id();
$table->string('name');
$table->string('email');
$table->timestamps();
});
Schema::dropIfExists('authors');
La migration create_comments_table :
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
$table->id();
$table->integer('article_id');
$table->integer('author_id');
$table->text('body');
$table->timestamps();
});
Schema::dropIfExists('comments');
Maintenant que nous avons le contenu de nos migrations qui est fait, nous
pouvons les jouer avec la commande :
Bien évidemment, tout ce qui est décrit dans cet article est donné à titre
d’exemple pour comprendre ce que sont les modèles et leur concept. Si vous
faites un blog, je doute que vous utilisiez cette logique de données, mais je
trouvais l’exemple facile à comprendre pour un nouveau venu dans Laravel et
pour utiliser ce que le framework propose. Il est temps de passer à la partie la plus
intéressante, les modèles de données.
Commencons par remplir le modèle de données Article, son contenu est alors le
suivant :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
return $this->hasMany(Comment::class);
}
return $this->belongsTo(Author::class);
// suite du model
Dans ce modèle Article j’ai volontairement appliqué un typage fort pour respecter
les bonnes pratiques du langage PHP et éviter les problèmes dans le futur. De
plus, cela permet à votre IDE (environnement de développement intégré) de
mieux comprendre ce qu’il se passe.
J’ai également ajouté un use statement pour chaque classe de relation que nous
utilisons dans ce modèle. Cela permet à PHP d’importer automatiquement les
classes nécessaires au moment de l’exécution, ce qui nous évite d’avoir à spécifier
le chemin complet à chaque fois que nous voulons utiliser une classe de relation.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
return $this->belongsTo(Article::class);
}
return $this->belongsTo(Author::class);
// ...
J’ai donc indiqué avec mes relations belongsTo qu’un commentaire n’appartient
qu’à un seul article, et qu’il ne peut avoir qu’un seul auteur, pratique non ? À
présent, on peut passer au dernier modèle qui permet de compléter le tout.
Notre dernier modèle sera comme vous le devinez Author :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
return $this->hasMany(Article::class);
return $this->hasMany(Comment::class);
}
// suite du model
En conclusion avec ce modèle dans Laravel, on indique via les relations dans
notre modèle de donnée qu’un auteur peut donc avoir plusieurs articles et bien
évidemment plusieurs commentaires. J’espère que ce petit exemple vous sera
utile. Ce n’est pas pour autant terminé, car nous n’avons pas encore vu toutes les
relations. Il nous manque ainsi les relations hasOne et belongsToMany, voyons
voir comment on peut faire pour les introduire dans notre petit projet de blog.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
return $this->belongsTo(Author::class);
// suite du model
{
// code des précédentes relations
return $this->hasOne(Profile::class);
Bon, on y est presque pour le tour des relations ! Si vous suivez toujours, il nous
manque une petite dernière que nous allons illustrer facilement. Pour introduire
la relation belongsToMany dans notre super blog, on pourrait ajouter des
catégories pour nos articles. Vous avez maintenant l’habitude, on crée donc le
modèle Category :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
return $this->belongsToMany(Article::class);
// précédentes relations
public function categories(): BelongsToMany
return $this->belongsToMany(Category::class);
// suite du model
MIDDLEWARE
Il sert à introduire une logique, une condition pour exécuter telle ou telle
méthode présente dans le controller.
$this->middleware('auth');
Pour commencer à utiliser Laravel UI, vous devez d'abord installer le package via
composer.
composer require laravel/ui
Une fois que vous avez installé Laravel UI, vous pouvez utiliser la commande ui
pour générer l'interface d'authentification. La commande suivante générera les
vues nécessaires à l'authentification, ainsi que les routes et les contrôleurs
correspondants :
php artisan ui bootstrap –-auth
Le formulaire utilise la méthode POST pour envoyer les données à l'URL spécifiée
par la route login. Il utilise également une directive Blade @csrf pour générer un
champ de jeton CSRF, qui est une mesure de sécurité pour prévenir les attaques
de type Cross-Site Request Forgery.
Dans notre exemple nous allons faire une nouvelle installation de Laravel. Voici
donc les étapes de la mise en place d’un middleware personnalisé :
Cd laravel-admin
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_admin
DB_USERNAME=root
DB_PASSWORD=
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('users');
}
};
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Auth;
class IsAdmin
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if(Auth::user() && Auth::user()->is_admin == 1){
return $next($request);
}
return redirect('home')->with('error', 'You have not admin access');
}
}
protected $middlewareAliases = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'precognitive' =>
\Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
'signed' => \App\Http\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
Créez des routes qu'un administrateur doit protéger. Si l'utilisateur n'est pas un
administrateur, il sera redirigé vers la page d'accueil. Sinon, il peut visiter cette
page. Désormais, si je souhaite attribuer des routes à cet administrateur
middleware, ces routes seront sécurisées et accessibles uniquement si
l'utilisateur autorisé est un administrateur. Sinon, vous serez redirigé vers la page
d'accueil.
<?php
use Illuminate\Support\Facades\Route;
use \App\Http\Controllers\HomeController;
use \App\Http\Controllers\CategorieController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
});
Ajoutons un lien d’accès vers la page admin depuis la page qui s’ouvre après la
connexion
resources\views\home.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Tableau de bord</div>
<div class="card-body">
@if (session('error'))
<div class="alert alert-danger">
{{ session('error') }}
</div>
@endif
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
</div>
<div class="card-body">
<div class="panel-body">
Test admin template:
<a href="{{route('admin.home')}}"> Page administrateur </a>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
resources\views\admin-home.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Page administrateur</div>
<div class="card-body">
Bienvenue dans le tableau de bord Administrateur
</div>
</div>
</div>
</div>
</div>
@endsection
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index()
{
return view('home');
}
Dans ce tutoriel sur Laravel, nous allons apprendre à gérer des rôles basiques à
l’aide d’un middleware. Nous allons avoir le rôle des utilisateurs classiques,
lorsqu’ils s’inscrivent tout simple sur notre site Web sous Laravel et le rôle
administrateur qui a des droits plus étendus. Le but vous l’avez compris, avec
l’aide du middleware, c’est que nos utilisateurs classiques ne puissent pas
accéder aux routes de l’administrateur. Par contre, l’administrateur pourra bien
évidemment se balader sur l’ensemble des pages du site et exécuter toutes les
routes comme un utilisateur normal de notre espace membre.
On commence par créer une première migration dans Laravel qui va s’occuper
de stocker nos différents rôles pour les utilisateurs :
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Le rôle administrateur (admin) qui aura accès à toutes les pages de mon
application avec par exemple un futur panel d’administration que nous
verrons dans un autre tutoriel.
Le rôle utilisateur classique (user) que l’on obtient juste après son
inscription et qui ne permet pas d’accéder à l’administration du site
(heureusement).
Le rôle abonné (subscriber) quand dans le cas où une partie de mon site
est payante, je pourrais basculer un utilisateur du rôle user à subscriber.
Le rôle de gestionnaire (manager)
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
Si vous avez bien suivi, vous êtes sûrement en train de vous dire qu’il manque
quelque chose ? En effet, il faut qu’on lie cette nouvelle table roles à la table des
users ! Étant donné qu’on a déjà la table user par défaut dans Laravel, on ne va
pas la toucher et on va plutôt refaire une migration pour ajouter cette relation de
roles sur users. On va créer donc une nouvelle migration
add_role_id_to_users_table :
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Cette migration ajoute la colonne « role_id » à la table « users » avec une clé
étrangère vers la table « roles ». De plus, le rôle par défaut d’un nouvel utilisateur
qui s’inscrit est 2 et donc simple user. Lancez la commande suivante pour mettre
à jour votre base de données avec cette nouvelle migration :
Un rôle va servir pour plusieurs utilisateurs, il faut donc créer la bonne relation. On
va ajouter le contenu suivant dans notre nouveau model Role :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
Un utilisateur ne peut avoir qu’un seul rôle. Donc attention, il ne faut surtout pas
oublier d’ajouter cette partie dans notre model User. Si vous ne le faites pas, alors
notre middleware ne pourra pas récupérer et vérifier le rôle de l’utilisateur
courant qui est authentifié. Voici ce que vous devez ajouter dans le model User :
public function role()
{
return $this->belongsTo(Role::class, 'role_id');
}
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class CheckRole
{
public function handle(Request $request, Closure $next, $role): Response
{
try {
$user = auth()->user();
return $next($request);
}
}
Quelques explications sur ce code qui va nous permettre de vérifier les rôles pour
l’accès aux pages de notre application Laravel :
Encore une fois le but est de rester le plus simple possible. On va donc créer des
routes basiques dans le fichier routes/web.php :
CREATION BLOG
https://kinsta.com/fr/blog/blog-laravel/
https://www.xarala.co/blog/comment-creer-un-blog-avec-laravel-php-et-mysql/
https://www.educative.io/answers/how-to-verify-an-authenticated-user-in-blade
https://www.akilischool.com/cours/laravel-crud-avec-upload-dimage