Bonjour...rebonjour
Je viens de terminer le tuto https://www.grafikart.fr/formations/programmation-objet-php/mvc-model-view-controller

Wahou, super tuto depuis des années je me perds dans des livres et la c'est la révélation lol

Mais du coup... cela me révèle d'autre problème que je n'avais pas avant (avec WP)

La sécurité je suis donc confronté pour la 1er fois sur un cas réel.... :)

Sur la page index est installé des liens pour pointer vers les CONTROLLER (et oui maintenant je sais ce que c'est...)

Mais si dans l'url je tappe n'importe quoi comme on recupère les paramètres avec $page = $_GET['p'];

et qu'on lance

$controller = '\App\Controller\\' . ucfirst($page[0]) . 'Controller';

Ben si j'ai n'importe quoi ca plante puisque la class controller machin n'existe pas...

J'ai tenté

if (!class_exists($controlle, false)) {around die() ;around }

dans l'index mais il ne peut pas tester avant l'autoloader
donc je l'ai mis dans l'autoloader

mais de retour dans l'index ca plante encore puisque

$controller->$action();
n'est pas possible....

en gros j'ai tenté des truc mais je ne comprends pas l'angle d'attaque...

6 réponses


Tu devrais normalement avoir une méthode static loadcontroller qui instancie le controller avec un new
il faut faire le test juste avant et pourquoi pas lever une exception

PS: ta variable $controller devrait s'appeler $controllerName car là ça porte à confusion

scamphp
Auteur

salut oui j'ai un loader général pour mes classes au début de mon fichier

le principe c'est :
loaderclass -> je récupère les param de l'url -> je génère le controller qui va bien->qui sera chargé par le loaderclass (situé en début de fichier).

Faiut-il chercher à empécher l'erreur dans l'index (en donnant les réponses possibles et si c'est différent des réponses possible fait ceci ou ou)
o
faut-il mieux gérer les erreurs car c'est normal d'avoir une erreur puisqu'il y a une erreur dans les param de l'url (volontaire ou incolontaire).

Salut,

Est-ce que tu peux me dire si j'ai bien compris le problème :

Ton site fonctionne bien si tu rentre des URL pertinentes,
mais si tu rentre des url absurde (à la main dans la barre d'adresse),
alors tu as un message d'erreur tout moche de PHP qui s'affiche,
ALORS QUE toi tu aimerai pouvoir gérer ce genre de cas avec un message
personalisé plus joli. Ce serai plus propre quoi.
Est-ce que c'est ça ?

Si c'est bien ça le problème, tu peux utiliser un système de router.
Le principe c'est que tu repertorie TOUTES les "formes" de liens possibles de
ton site sous forme d'expression régulière.
(tel expression régulière va vers tel controller, sur telle action, avec tels paramètres GET...)
Et en dernier, tu mets une règle qui va rediriger n'importe qu'elle URL qui ne
correspond à aucune que tu as repertorié, vers par exemple ta page "notFound.php".

Grafikart a fait un tutoriel sur le principe du router.

Mais je ne suis pas sûr que c'était ça que tu voulais.

scamphp
Auteur

Non, je voulais chercher à empecher les erreurs, mais je viens de me rendre compte que ca sert à rien...
si un utilisateur change un param dans mon url ca crée des messages d'erreur... FATEL ERROR
Je voulais empecher ces messages d'erreur en essayant d'empecher les erreurs....
Alors que s'il y a une erreur il ne faut pas chercher a vouloir afficher son site coute que coute, mais plutot présenter proprement l'erreur try catch... etc etc

C'est pas compliqué de renvoyer une page 404 en cas d'erreur, qu'est-ce qui te bloque ?
savoir si la route demandée existe ou pas c'est le B-A BA du router

Alors que s'il y a une erreur il ne faut pas chercher a vouloir afficher son site coute que coute, mais plutot présenter proprement l'erreur try catch... etc etc

Oui voilà, mais justement comment tu fais pour savoir s'il y a eu une erreur dans l'URL ou pas ?
Comme dit Huggy, c'est par un système de routeur que tu fais ça, et tu rediriges vers une page 404.

Moi aussi j'ai un peu de mal a cerner ton problème.

Je crois que tu as du mal a trouver une solution à ton problème parce-que tu ne connais pas le système d'un "routeur".
C'est bien ça ? Mais je pense que c'est bien un routeur la solution à ton problème.