Salut à tous,

Je suis en train de suivre le tuto sur Slim Framework et j'ai un gros soucis. Il ne veux pas charger ma class PagesController. Voici mes codes :

<?php

    namespace Rooter;

    class Router {

        private $app;

        public function __construct($app) {
            $this->app = $app;
        }

        public function get($url, $action) {
            return $this->app->get($url, function() use ($action) {
                $action = explode(':', $action);

                $controller_name = $action[0] . 'Controller';
                $method = $action[1];

                $controller = new $controller_name($this->app);

                call_user_func_array([$controller, $method], func_get_args());
            });
        }
    }
<?php

    namespace Controller;

    class Controller {

        protected $app;

        public function __construct($app) {
            $this->app = $app;
        }
    }
<?php

    namespace Controller\Pages;

    use Controller\Controller;

    class PagesController extends Controller {

        public function hello($name) {
            $this->app->render('hello.html.twig', array(
                'name' => $name,
            ));
        }
    }
{
  "require": {
    "slim/slim": "2.*",
    "slim/views": "0.1.*",
    "twig/twig": "~1.0"
  },
  "autoload": {
    "psr-4": {
      "Rooter\\": "rooter",
      "Controller\\": "controllers"
    }
  }
}

Et du coup il ne trouve pas ma class PagesController, je suis obligé de mettre un autoloader dans mon dossier controllers et retirer mes namespaces de mes controllers pour que tous se charge correctement.
Et si je mets de autoloader partout cela ne sert à rien que j'utilise celui de composer.
Et avant que l'on me pose la question j'ai bien fais un composer install

Des idées ?

Merci d'avance et bon weekend

16 réponses


Alexandre #lbac
Réponse acceptée

Tu as une route

$app->get('/hello/:name', '\Greeting:sayHello');

Greeting correspond au nom de la classe et sayHello à la méthode :name étant le paramètre.

En revanche je ne me suis pas renseigné pour savoir où se situaient les controllers.

Salut BaBeuloula ! Bon tout d'abord je tiens à te prévenir que je ne suis pas un expert en php avec slim !

Je pense tout de même avoir des pistes pour t'aider. As tu regardé la doc de slim sur l'héritage des classes ? Es tu sur de pouvoir juste faire un extends ?

Sinon, as tu bien respecté le model MVC (model view controller) ? C'est à dire que toutes tes fonctions php vont dans "models" et toutes tes fonctions d'affichage sont dans "views" ? Car normalement dans le dossier slim que le site te fais telecharger, tu as dejà un index.php (le controller) où le $app get est déjà initialisé.

Exemple de début de controller :

http://prntscr.com/5t8xww

(j'ai mis le lien en dur car l'insertion d'image n'a pas marché pour moi ...)
Donc essayes dans ton controller de mettre un " require_one 'TONDOSSIER/PagesController.php'; "

Là tout en haut de mon controller tu vois bien que j'ai juste à appellé ma class User qui est dans mon model. Si ton problème vient de l'héritage, là je ne pourrai pas t'aider.

J'espère que cela pourra t'aider ! Bonne chance

Merci de ton aide, je vais essayer ça. Sinon en attendant comme je le disais j'ai mis un autoloader dans mon dossier Controllers et Models. Ce n'est pas grâve mais bon.
Je viens de mettre en place sur dl.free.fr mon bootstrap Slim avec Twig. Des fois que des gens veulent regarder ce que j'ai fais et améliorer le tout au cas où j'ai codé comme une m*****

Slim Framework a évolué depuis le tutoriel et gère lui même les controllers ;)

https://github.com/codeguy/Slim/releases

Depuis la 2.4 si je ne dis pas de bêtises

Mais il ne les gère pas comme dans le tuto, est je trouve cela plus propre de faire comme dans le tuto, non ?

Eh bien si il me semble qu'il gere tout ca. Dans ta "route" que tu fais dans le controller il te suffit de transmettre les données d'un model à un autre.

Je n'arrive pas à piger le système, quelqu'un pourrait m'éclairer ?

Tu peux me donner le lien où tu as trouvé ça car je viens de chercher dans la doc et je ne trouve pas.

Merci

Dans le lien que j'ai posté juste au dessus...

J'avais mal cherché merci. Je vais essayer de regarder sur Internet car c'est quand même bizarre qu'ils mettent un système de controller et qu'ils n'en parlent même pas dans leur doc

Je pense qu'elle n'est pas à jour c'est pour ça, il faut tester et regarder le code ^^

Ton controller va servir juste à définir des routes, c'est à dire :
exemple : au lieu de faire ta route "http://mondom.com/ressources/views/photo.php " dans ton url tu auras juste à mettre "http://mondom.com/photo" et cela te renverra directement sur le lien précédent.
exemple : http://prntscr.com/5vjfld

Et dedans tu peux transmettre des variables etc ...

Alors soit c'est moi qui ai mal compris soit c'est toi ^_^
En fait SquallX à dit que l'on pouvait depuis la version 2.4 avoir des controllers :

$app->get('/hello/:name', '\Greeting:sayHello');

Le truc c'est que sur la doc rien n'est expliqué, etsi je me souviens bien de mes cours, un controller ne sert pas à définir les routes, mais les actions et décisions à faire. Justement les routes c'est le router qui s'en charge non ?

Bah moi dans ce que j'ai appris du MVC : c'est un dossier models (fonctions php qui manipulent tes données) views (qui affichent ce que tu veux) et controller (qui fait communiquer les deux précédents).
Sur slim, j'ai toujours appris qu'il fallait faire les routes dans ton index.php (controller) qui est à la racine du dossier (tu peux l'appeller comme tu le souhaite c'est pas un soucis.) qui lui va appeler tes layouts etc ...
Donc personnellement j'ai fais une appli qui utilise l'API instagram (via un package trouvé sur git) où toutes mes routes sont sur mon controller pour manipuler toutes les données instagram.
Cela marche très bien, donc je te donne mes solutions mais je ne prétend pas être un prof de slim haha, ma méthode marche très bien et je la trouve propre. Slim est un framework mais dit "léger". Sinon si tu veux avoir un dossier très bien structuré, utilise d'autres framework genre symfony ou CodeIgniter :)
J'espere tout de même t'avoir aider !

Oui là je suis d'accord avec toi. Après je trouve que mettre tout ton controller dans la page d'index peut devenir vite un gros foutoire si tu as beaucoup de page. C'est pour ça que le tuto de Grafikart sur le sujet proposait de créer un système de controller, mais du coup j'ai voulu faire pareil mais je ne comprends pas pourquoi il ne chargait pas mes controllers.
En attendant j'ai fais comme j'ai dis plus haut avec un système d'autoloader pour mes modèles et mes controllers (certes moche mais fonctionnel).
Je vais continuer d'éplucher le code source de Slim pour essayer de comprendre comment mettre en place les controllers qu'ils sont eux même implémentés depuis la version 2.4

Merci à vous tous

C'est simple, fais un fichier ou tu fais toutes tes routes. Maintenant, sur ton controller, appelle ce fichier qui executera toutes tes routes :) T'enleve 10 000 pour en mettre qu'une seule. (Désolé si j'ai mis du temps à comprendre ce que tu voulais haha)