Décrivez ici votre problème ou ce que vous cherchez à faire.
Avec composer je veux charger dynamiquement le nom des class
Entourez votre code en utilisant "
index.php
use App\App; require_once '/vendor/autoload.php'; new Dispatcher()
src/Dispatcher.php
namespace App; ... function loadController(): object { //return new ControllerVoir(); //fonctionne $name='ControllerVoir'; return new $name(); } "Fatal error: Uncaught Error: Class "ControllerVoir" not found
...
composer.json
... "autoload": { "psr-4": { "App\\": "src/" }

Ce que je veux

Comment obtenir le nom des class avec paramètre sachant que ce code fonctionne sans utiliser composer (avec les bons require bien evidemment.
Manifestement le string n'a pas l'air d'être interprété avec les parenthèses comme un nom de class

Ce que j'obtiens

Fatal error: Uncaught Error: Class "ControllerVoir" not found

3 réponses


binosor
Auteur

J'ai trouvé, il faut ajouter le namespace, ici `$name='App/ControllerVoir'

Hello,
Est-ce que le plus simple ne serait pas de demander de base le namespace complet du controller que tu veux charger ?

Le controller :

namespace App\Controller;

class AdminController
{
    public function index(): string
    {
        return '';
    }
}

La fonction de load :

use InvalidArgumentException;

function load(string $controller, string $action): mixed
{
    if (!class_exists($controller)) {
        throw new InvalidArgumentException(sprintf("Unknown class '%s'", $controller));
    }
    $instanceController = new $controller();

    if (!method_exists($instanceController, $action)) {
        throw new InvalidArgumentException(sprintf("Unknown method '%s' in class '%s'", $action, $controller));
    }

    return $instanceController->$action();
}

Un autre fichier qui call la fonction load :

use App\Controller\AdminController;

load(AdminController::class, 'index');
// identique : load(\App\Controller\AdminController::class, 'index');
binosor
Auteur

Mon idée est d'obtenir la valeur du contrôleur par un routeur et donc d'avoir des attributs plutôt que des paramètres. Mais le code est intéressant, la difficulté que je rencontrais était de faire fonctionner l'autoloder sous composer. Ici, je ne pense pas qu'il n'y ait pas de problèmes.
Merci pour la réponse.
P.S. j'admire l'indentation que je n'ai pas reussi à faire !