Formation PUB030 : Laravel, 2019 Les espaces de noms

16.1 Les espaces de nom et l'instruction use, ou à quel endroit Laravel recherche-t-il les classes ?


Lorsque vous utilisez une classe dans votre code, Laravel tente de retrouver la définition de cette classe dans l'espace de nom actuel (namespace du code dans lequel on veut utiliser ladite classe). Il s'agit du même principe que dans l'ensemble des langages de programmation qui utilisent les espaces de noms.

▼Publicité Le texte se poursuit plus bas

Alors comment fait-on pour utiliser une classe qui est définie dans un espace de nom différent ? C'est ce que vous allez découvrir dans cet article.

Prenons l'exemple d'une classe MaClasse qui a été définie dans l'espace de nom App\MaBibliotheque :

Contrôleur Laravel (PHP)

<?php

 

namespace App\MaBibliotheque;

 

class MaClasse

{

    ...

}

Dans le code suivant, Laravel tentera sans succès de retrouver MaClasse dans l'espace de nom App\Http\Controllers :

Contrôleur Laravel (PHP)

<?php

 

namespace App\Http\Controllers;

 

class ProduitsController extends Controller

{

    public function index() : View

    {

        $monObjet = new MaClasse;

        ...

    }

    ...

}

Si la classe avait été définie dans le même espace de nom que le code qui tente de l'utiliser, tout aurait fonctionné normalement.

Mais dans le cas présent, comme la classe n'a pas été définie dans le même espace de nom, vous obtiendrez l'erreur « Class 'App\Http\Controllers\MaClasse' not found ». Ceci démontre clairement à quel endroit Laravel a recherché la classe.

Trois choix s'offrent alors à vous :

  • Spécifier l'espace de nom de la classe lors de son utilisation :
    Contrôleur Laravel (PHP)

    $monObjet = new \App\MaBibliotheque\MaClasse;

    ou

  • Ajouter une instruction use afin d'indiquer à Laravel à quel endroit rechercher les classes qui n'appartiennent pas au même espace de nom :
    Contrôleur Laravel (PHP)

    use App\MaBibliotheque\MaClasse;

    ...

    $monObjet = new MaClasse;

    ou

  • Demander à Laravel de charger automatiquement les classes de cet espace de nom grâce à une entrée dans le fichier composer.json :
    composer.json

    {

        "name": "laravel/laravel",

        ...

        "autoload": {

            "classmap": [

                "database",

                "app/MaBibliotheque"

            ],

            "psr-4": {

                "App\\": "app/"

            }

        },

        ...

    }

    Suivi de l'instruction qui demande de recharger le tout :

    Console Vagrant SSH

    composer dump-autoload

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 29 décembre 2017
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre