Tutoriel Laravel 9 #3 : La structure MVC

Installation des outils nécessaires

La structure MVC signifie que l’application est divisée en trois parties. Le (M) modèle définit le modèle de données, (V) vue présente les données et (C) contrôleur définit la logique et manipule les données.

Contrôleurs

Voici un lien vers la section sur les contrôleurs de la documentation officielle : https://laravel.com/docs/9.x/controllers

Contrôleurs de base

Un contrôleur est un endroit où vous organisez les comportements de votre application. Par exemple, lorsque le routeur reçoit « /« , il renvoie un « IndexController« .

Le « IndexController » récupère les informations requises dans la base de données par l’intermédiaire d’un modèle, puis les place dans l’emplacement correspondant d’une vue, et enfin renvoie la vue au navigateur.

C’est l’utilisation la plus basique d’un contrôleur. Bien sûr, il peut faire beaucoup plus que cela, et j’en parlerai lorsque nous rencontrerons des problèmes spécifiques plus tard dans le tutoriel.

Pour créer notre premier contrôleur. Allez dans le terminal, tapez :

php artisan make:controller IndexController

Allez à app/Http/Controllers/et vous trouverez un IndexController.php

<?php
namespace App\Http\Controllers;
use IlluminateHttpRequest;

class IndexController extends Controller
{
    //
}

Notez que le contrôleur étend la classe de contrôleur de base incluse dans Laravel. La classe de base fournit quelques méthodes pratiques telles que la propriété $middleware.

Nous pouvons essayer de lui faire retourner une chaîne de caractères en créant une fonction dans la classe :

class IndexController extends Controller
{
    //
    public function index()
    {
        return  'C\'est mon contrôleur IndexController';
    }
}

Nous avons créé une méthode appelée index()et dans cette méthode, nous retournons une chaîne de caractères  « C’est mon contrôleur IndexController« .

Afin de tester notre code, nous devons faire en sorte qu’un routeur renvoie le « IndexController« . Retournez à web.php et créez un nouveau routeur comme ceci :

use App\Http\Controllers\IndexController;

Route::get('/', [IndexController::class, 'index']);

Remarquez que le deuxième argument n’est plus une fonction, c’est [IndexController::class, 'index'] ce qui signifie qu’il faut aller à l’adresse IndexController trouver le index() et exécute ce qu’elle contient.

Dans le navigateur, allez à http://localhost:8000

Nous pouvons également faire en sorte que le IndexController pour retourner une vue.

class IndexController extends Controller
{
    //
    public function index()
    {
        return view('welcome');
    }
}

Rafraîchissez le navigateur, cela nous permettra d’obtenir le même résultat que dans l’article précédent :

Contrôleurs à action unique

Les contrôleurs à action unique sont utiles lorsque nous n’avons besoin que d’une seule méthode dans la classe du contrôleur :

class IndexController extends Controller
{
    //
    public function __invoke()
    {
        return view('welcome');
    }
}

Maintenant, nous pouvons modifier la route que nous venons de définir. Nous n’avons plus besoin de spécifier la méthode.

Route::get('/', IndexController::class);

Ce code fonctionnera exactement de la même manière que précédemment.

Vues ( Template Blade )

Réexaminons la vue welcome.blade.php vous remarquerez qu’il s’agit simplement d’un fichier HTML. Oui, les vues sont basées sur HTML et CSS puisque c’est ce que vous voyez dans le navigateur, mais les choses sont légèrement plus compliquées que cela.

S’il ne contient que des codes HTML, le blog entier serait statique, et ce n’est pas ce que nous voulons. La vue devrait donc « dire » au contrôleur où placer les données qu’il a récupérées.

Héritage des templates

Définir une mise en page principale

Le principal avantage de l’utilisation du modèle Blade est que nous n’avons pas besoin d’écrire le même code encore et encore. Créons un master.blade.php dans le dossier templates.

<html>
    <head>
        @yield('meta')
    </head>
    <body>

        @section('sidebar')

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

Remarquez les deux directives @section et @yield. Le site @section('sidebar') signifie que Laravel cherchera un modèle de lame nommé « sidebar.blade.php« , et l’importera ici. Le site @yield est utilisée pour afficher le contenu d’une section donnée.

Étendre une mise en page

Ici, nous créons une autre vue index.blade.php.

@extends('master')

@section('meta')
    <meta charset="UTF-8">
    <meta name="description" content="Tutoriel Laravel 9 gratuit">
    <meta name="keywords" content="HTML, CSS, JavaScript">
    <meta name="author" content="John Doe">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
@endsection

@section('content')
    <p>Corps du contenu.</p>
@endsection

Lorsque cette vue est appelée, Laravel recherche le fichier master le modèle de lame que nous venons de créer. Remplacer @yield('meta') par le meta et remplacer @yield('content') par la section du contenu.

Avec ces deux directives, nous sommes en mesure de construire n’importe quel type de hiérarchie de modèles que nous voulons.

Syntaxe

Affichage des données

Commençons par apporter quelques modifications à notre IndexController :

class IndexController extends Controller
{
    //
    public function __invoke()
    {
        return view('index', ['name' => 'Damien']);
    }
}

nous avons défini une variable name ici, et sa valeur est Damien. N’oubliez pas que c’est également la nouvelle syntaxe de Laravel 9.

Dans la vue de l’index, nous changeons la section du contenu en ceci :

<p>Bonjour, {{ $name }}.</p>

Le résultat sera Bonjour, Damien..

Condition "If"

Vous pouvez construire if en utilisant l’option @if, @elseif, @elseet @endif et@endif. Ces directives fonctionnent de la même manière que leurs équivalents en PHP :

@if (count($records) === 1)
    J'ai un résultat
@elseif (count($records) > 1)
    J'ai plusieurs résultats
@else
    Je n'ai pas de résultat
@endif

Condition "switch"

Les instructions de commutation peuvent être construites en utilisant la fonction @switch, @case, @break, @default et @endswitch directives :

@switch($i)
    @case(1)
        Premier cas
        @break

    @case(2)
        Deuxième cas
        @break

    @default
        Cas par défaut
@endswitch

Boucles "for", "foreach", "while"

En plus des instructions conditionnelles, Blade fournit des directives simples pour travailler avec les structures de boucles de PHP. Encore une fois, chacune de ces directives fonctionne de manière identique à leurs homologues PHP :

@for ($i = 0; $i < 10; $i++)
    Le résultat actuel est {{ $i }}
@endfor

@foreach ($users as $user)
    <p>L'utilisateur : {{ $user->id }}</p>
@endforeach

@forelse ($users as $user)
    <li>{{ $user->name }}</li>
@empty
    <p>Pas d'utilisateur</p>
@endforelse

@while (true)
    <p>Boucle infinie.</p>
@endwhile

Modèles

Vous vous souvenez que j’ai dit que les contrôleurs sont chargés de récupérer les données de la base de données ? Eh bien, c’est là que les modèles interviennent.

Chaque table de la base de données a un « Modèle » correspondant, et ce modèle va gérer toutes les interactions avec la table.

Définir les modèles

La manière la plus simple de créer une instance de modèle est d’utiliser la fonction make:model Commande Artisan :

php artisan make:model Test

Si vous souhaitez générer les fichiers de migration correspondants, vous pouvez utiliser la commande --migration ou -m option :

php artisan make:model Test --migration

php artisan make:model Test -m

Voici un exemple de modèle et de fichier de migration :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    //
}
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTestsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tests');
    }
}

Nous n’entrerons pas dans les détails pour l’instant car cela peut être assez déroutant pour les débutants mais sachez que le fichier de migrations permettra à Laravel de créer la table directement dans votre base de données et le modèle est la classe qui communiquera directement avec cette table.