Controller Slim Framwork

Par BaBeuloula, il y a 11 ans


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

piaarre, il y a 11 ans

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

BaBeuloula, il y a 11 ans

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*****

BaBeuloula, il y a 11 ans

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

piaarre, il y a 11 ans

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.

BaBeuloula, il y a 11 ans

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

Alexandre #lbac, il y a 11 ans

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.

BaBeuloula, il y a 11 ans

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

Alexandre #lbac, il y a 11 ans

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

BaBeuloula, il y a 11 ans

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

Alexandre #lbac, il y a 11 ans

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

BaBeuloula, il y a 11 ans

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 ?

piaarre, il y a 11 ans

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 !

BaBeuloula, il y a 11 ans

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

piaarre, il y a 11 ans

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)