Appel d'une classe d'un autre namespace

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J'ai suivi des tutoriels vidéo afin d'apprendre la POO, mais dans ce tutoriel, il n'y avait hélas pas de système de routeur.

Du coup, j'ai décidé d'essayer d'adapter celui d'un autre tutoriel mais, j'ai un problème que je ne sais comment résoudre car j'utilise des namespace.

Je précise également qu'il y a un autoloader qui permet de charger dynamiquement mes fichiers lorsque je fais appel a mes classes.

Image utilisateur

Le routeur se trouve dans le dossier core soit le namespace Core Mes controllers se trouvent dans le dossier app\Controllers soit le namespace EVE\Controllers.

Donc, j'ai ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php 
namespace Core;

class Dispatcher {

    private static $_instance;
    var $request;

    /**
     * @return Dispatcher Permet d'instancier la classe une seule fois.
     */
    public static function getInstance() {

        if (is_null(self::$_instance)) {
            self::$_instance = new Dispatcher();
        }
        return self::$_instance;
    }

    public function __construct() {
        $this->request = new Request();
        Router::parse($this->request->url, $this->request);
        $controller = $this->loadController();
    }

    public function loadController() {
        $controllerName = ucfirst($this->request->controller) . 'Controller';
        return new $controllerName($this->request);
    }
}

Donc, dans la fonction loadController lorsque je veux faire le return, j'aimerai qu'il dise : - "Tu vas me chercher la classe $controllerName qui est dans le namespace EVE\Controllers."

Cependant, j'ai essaye diverses methodes qui me sont infructueuses telles que :

return new \EVE\Controllers\ $controllerName($this->request);

ou

return new \EVE\Controllers\ . $controllerName($this->request);

J'ai même essayé avec un use EVE\Controllers; en haut du fichier mais cela continue de me bloquer.

J’espère que ma requête est assez claire et assez détaillées.

D'avance, merci de vos réponses.

Édité par selmac

+0 -0

Cette réponse a aidé l'auteur du sujet

Bonjour,

Qu'elle est l'erreur qui s'affiche précisément ?

Ensuite, au lieu de faire

1
2
3
<?php 
$controllerName = ucfirst($this->request->controller) . 'Controller';
return new \EVE\Controllers\ . $controllerName($this->request);

Ce n'est pas plutôt ça :

1
2
3
<?php 
$controllerName = ucfirst($this->request->controller) . 'Controller';
return new '\\EVE\\Controllers\\' . $controllerName($this->request);

?

EDIT: perso je testerai comme ça plutôt

1
2
3
<?php 
$controllerName = '\\EVE\\Controllers\\' . ucfirst($this->request->controller) . 'Controller';
return new $controllerName($this->request);

Édité par Zayon

+2 -0
Auteur du sujet

alors avec

1
2
3
<?php 
$controllerName = ucfirst($this->request->controller) . 'Controller';
return new \EVE\Controllers\ . $controllerName($this->request);

J'ai cette erreur : Parse error: syntax error, unexpected '.', expecting identifier (T_STRING) in /var/www/local.dev/Lab/Atlas/core/Dispatcher.php on line 28

1
2
3
<?php
$controllerName = ucfirst($this->request->controller) . 'Controller';
return new '\\EVE\\Controllers\\' . $controllerName($this->request);

J'ai cette erreur : Parse error: syntax error, unexpected ''\EVE\Controllers\'' (T_CONSTANT_ENCAPSED_STRING) in /var/www/local.dev/Lab/Atlas/core/Dispatcher.php on line 28

Edit : Je viens de tester ta 3eme solution que je viens de voir et ça fonctionne. Merci :)

Édité par selmac

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte