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.

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.

▼Publicité

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\HttpControllers :

Contrôleur Laravel (PHP)

<?php

 

namespace App\HttpControllers;

 

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

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories

Laisser un commentaire

1 + 4 =