Laravel – Les vues dynamiques

Laravel – Les vues dynamiques

28 mars 2018 Laravel MVC 3

Les pages statiques ne suffisent pas pour animer un site, il est nécessaire de créer des vues dynamiques dont le contenu proviendra de la base de données.

Nous allons partir du principe que nous avons deux variables générées par le contrôleur :

  • $articles contiendra une liste d’articles (titre, contenu, date, auteur)
  • $article contiendra les informations d’un seul article

Nous aurons deux vues, l’une affichera une liste d’articles, l’autre les détails d’un seul article, donc le contenu de nos variables.

Le contrôleur retournera donc la vue de la façon suivante

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class articlesController extends Controller
{
    public function articles(){
		// Ici se trouvera le code qui récupèrera la liste des articles
		// la variable $articles contient une liste d'articles
	    return view('articles', ['listeArticles' => $articles]); // La vue articles aura accès à la liste sous le nom listeArticles
    }
	public function article(){
		// Ici se trouvera le code qui récupèrera un article
		// la variable $article contient un seul article
	    return view('article', ['article' => $article]); // La vue article aura accès à un seul article sous le nom article
    }
}
Langage : PHP - Fichier app/Http/Controllers/articlesController.php

Accès à des données multiples

Lors de la création de la vue, nous devons connaître le type de données qui sont transmises. La variable listeArticles contient une liste d’articles, donc nous devront parcourir cette liste avec une boucle.

Voici le code de la vue qui affichera la liste des articles

@extends('layouts.layout')

@section('title', "Liste des articles")

@section('content')
	<h2>Liste des articles</h2>
    
	@foreach ($listeArticles as $single) <!-- Boucle qui parcourt la variable listeArticles -->
    	<article>
			<h3>{{ $single->titre }}</h3> <!-- chaque champ de la variable $single s'affiche entre {{ }}, syntaxe de Blade -->
			<p>Publié le {{ $single->date }} par {{ $single->auteur }}</p>
            <div class="content">
				{{ $single->contenu }}
			</div>
 		</article>
	@endforeach
@endsection
Langage : Blade/HTML - Fichier : resources/views/articles.blade.php

Accès à une donnée « unique »

Si le contrôleur envoie une seule ligne de données, la vue n’aura pas besoin de boucle, la variable étant directement accessible.

@extends('layouts.layout')

@section('title', $article->titre) <!-- Nous pouvons utiliser la variable pour le titre de la page -->

@section('content')
	<article>
		<h2>{{ $article->titre }}</h2> <!-- chaque champ de la variable $article s'affiche entre {{ }}, syntaxe de Blade -->
		<p>Publié le {{ $article->date }} par {{ $article->auteur }}</p>
		<div class="content">
			{{ $article->contenu }}
		</div>
	</article>
@endsection
Langage : Blade/HTML - Fichier : resources/views/article.blade.php

Partager des données avec toutes les vues

Il peut parfois être nécessaire d’accéder à des données dans plusieurs vues, voire toutes.

C’est tout à fait possible en ajoutant quelques lignes à la fonction boot (fonction de démarrage) de Laravel.

Cette fonction se situe dans le fichier app/providers/appServiceProvider.php

Si nous souhaitons, par exemple, passer une liste de catégories à toutes les vues, nous allons ajouter les lignes suivantes

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use App\categories as Categories; // ici un exemple de modèle, à adapter à votre cas 


class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $cats = Categories::orderBy('catOrder', 'asc')->get(); // Ici nous sélectionnons toutes les catégories
        View::share('cats', $cats); // Nous partagons le contenu de la variable $cats avec toutes les vues
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
Langage : PHP - Fichier : app/providers/appServiceProvider.php

 

3 réponses

  1. Wilfried dit :

    Bonjour, je viens de suivre ce petit tuto, je vous remercie parce que vous m’aidez vraiment à comprendre un peu mieux Laravel. Mon soucis se trouve au niveau du « partage des données avec toutes les vues ». En effet lorsque que je fais, on me dit que « View » n’est pas pas reconnu

    FatalThrowableError
    Class ‘crud_system\Providers\View’ not found

    Pouvez-vous m’aider svp ?

  2. Wilfried dit :

    J’utilise la version 5.4.* de Laravel

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *