La proposition de Lucas Tambarin ne peut fonctionner qu'avec l'introduction du container qui n'intervient que plus tard dans la formation (voir son implémentation ici : https://github.com/kelinox/Framework)
A l'heure d'aujourd'hui, le Zend Expressive Router n'est plus maintenu et l'auteur suggère d'utiliser Mezzio Router et son FastRouteRouter.
Bonjour,
Voila je rencontre un petit problème avec mon code. Je suis entraine de suivre la formation php pdo. J'ai commencé mon projet. J'ai un problème J'utilise cette librairie dans mon router de mon framework : https://packagist.org/packages/zendframework/zend-expressive-fastroute.
Ce que je fais
Dans mon code router j'ai une fonction match() qui vérifie si une route match et une fonction get() qui permet de faire une route avec la méthode GET
Ce que je veux
Les testes passe au vert :
Ce que j'obtiens
Mes teste ne passe pas et j'ai cette execption de ZendFramework qui s'affiche :
L'exeption d'écrit qu'il faut que ma classe implémente une interface MiddlewareInterface. J'ai regardé le controller principal de FastRouteRouter il implémente une interface RouterInterface avec les méthodes addRoute(), match(), et generateUri(). Ma classe Router utilise ces même fonction, j'ai ésayé defaire ériter de l'interface RouterInterface. Ça fonctione pas, j'ai toujours cette même exception qui s'attend à avoir une MiddlewareInterface.
Dans ma classe Route qui représente une Route matché j'ai des méthodes suivante :
Merci de votre aide
23 réponses
Lucas Tambarin merci
Bonjour,
En fait j'ai le même soucis, mais c'est pas une erreur du code originale de Grafikart, c'est parce que Zend à mis à jour son code.
Du coup sa fonctionne plus il dit qu'il faut implémenter le middleware interface à la place du [GET].
Je n'ai pour l'instant pas réussi à le faire fonctionner donc je peu pas trop aider mais peut être qu'un autre membre comprendras le problème et pourras venir à notre aide ;)
Si vous souhaitez, vous pouvez revenir à une version antérieure avec un composer require zendframework/zend-expressive-fastroute 2.1.0 ou en modifiant directement dans le composer.json et ensuite faire un composer update.
Bon j'avance un peu.
Dans ZendRoute il s'attend à voir une instance MiddlewareInterface de Webimpress sinon il renvoie sur la function triggerDeprecationForNonMiddlewareImplementation(). Le petit soucis c'est que nous utilisons pas le MiddlewareInterface de Webimpress du coup ca génère une erreur (enfin je pense).
Pour l'instant j'ai réussi à tout refaire fonctionner en commentant la ligne qui fait appelle à la fonction triggerDeprecationForNonMiddlewareImplementation() dans le fichier route.php de zend-expressive-router.
Mais ce n'est pas la meilleur solution (juste temporaire le temp de trouver mieux).
C'est quand même bizare que zend continue à utilisé webimpress et interop alors que cela ont été abandoné au profit de psr
Bonjour,
Il faut apparement explicitement implementer la version interop du MiddlewareInterface
On passe une instance au lieu d'un callable dans le test
Bonne journée
Bonjour,
je rencontre exactement le même problème et ne parviens pas à redescendre vers une version de zend-expressive-router qui "fonctionne" comme précédemment... En effet, dans la mesure ou zend-expressive-router est une dépendance de zend-expressive-fastroute, la version est gérée par celui-ci et je me retrouve donc avec la version 2.4.1 du router qui affiche le message d'erreur...
De plus, je n'arrive pas à voir comment implémenter la solution de @philippe74, si on doit créer une nouvelle instance de la classe, on perd tout l'intérêt du conteneur d'injection de dépendances dans la mesure on on doit passer toutes les dépendences en paramètre du constructeur... Quelqu'un sait-il m'éclairer?
Merci d'avance,
Nicwalle
Bonjour Nicwalle tu peux aller sur le tuto chapitre router, Spyke à donner une solution avec Aura.Router et tinmar81 une pour garder fasteroute (elle rejoint un peu ce que propose philippe74) et je bloque toujours sur la solution fasteroute.
Sinon pour revenir sur l'ancienne version tu dois noter le numéro de la version dans composer et enlever le ^
zendframework/zend-expressive-fastroute": "2.1.2"
tu peux aussi ajouter le zend router
zendframework/zend-expressive-router": "2.3.0"
puis un coup de composer update
Pour l'instant j'ai la dernière version j'ai commenter la ligne indiquer plus haut ça fonctionne même si ça me plaît pas
Bonjour Fred,
Merci pour ta réponse rapide !
En ce qui concerne la version, j'obtenais des erreurs (dues à des conflits) au niveau de composer.
Sinon, j'ai fait comme toi et j'ai modifié la ligne de vérification d'implémentation.
Je vais essayer cet autre router donc, merci !
Nicwalle
Salut
merci pour ton code
j'ai ça comme erreur:
Fatal error: Uncaught Error: Class 'Framework\MiddlewareApp' not found in D:\Labo\dev\MonFramework\src\Framework\Router.php:33 Stack trace: #0 D:\Labo\dev\MonFramework\src\Blog\BlogModule.php(13): Framework\Router->get('/blog', Array, 'blog.index') #1 D:\Labo\dev\MonFramework\src\Framework\App.php(32): App\Blog\BlogModule->construct(Object(Framework\Router)) #2 D:\Labo\dev\MonFramework\public\index.php(5): Framework\App->construct(Array) #3 {main} thrown in D:\Labo\dev\MonFramework\src\Framework\Router.php on line 33
bonne journée.
Bonjour,
J'ai modifié le code de Grafikart pour utiliser la version 3.0 de zend-expressive-fastroute
Jai utilisé le CombinedMiddleware de Grafikart pour encapsuler le callable (video 28)
La nouvelle version du MiddlewareInterface permet d'avoir un CombineMiddleware qui fait aussi Delegate.
Cela donne
Au niveau du dispatcher il faut legerement modifier (par rapport à la video (28-modification de profil)
if ($callback instanceof CombinedMiddleware) {
return $callback->process($request, $handler);
}
et enfin au niveau du router, il n'y a que l'appel deprecié a modifier dans la fonction match
$result->getMatchedRoute()->getMiddleware(),
En esperant que cela puisse aider.
Ca marche bien chez moi
Afin de pouvoir continuer à utiliser zend fast router voilà comment j'ai fait.
Tout d'abord créé une nouvelle classe dans src/Framework/Router/MiddlewareApp.php
ensuite à l'intérieur de cette classe, tu mets le code suivant :
Une fois cela fait, tu modifie le code de la fonction get de la façon suivante :
puis dans la fonction match le code est le suivant
et finalement pour tester dans la class RouterTest.php tu essayes avec le code suivant :
et normalement tout devrait rentrer dans l'ordre.
Si cela comporte des risques ou erreurs merci de me le signaler :)
Salut, c'est certainement que tu n'as pas importé le namespace Framework\Router\MiddlewareApp dans ta classe de test
Salut à tous,
Lucas merci pour ton code je viens d'essayer mais j'ai l'erreur suivante :
J'enregistre mes routes de la manière suivante :
Comment puis-je passer un type callable à la place de Actions\AuthAction::class ?
Merci d'avance
Salut alors de tête, tu peux passer à la place de
le callable de la façon suivante, c'est une fonction où le premier paramètre est un tableau avec ta classe et la méthode que tu veux appeler pour le callback, et le deuxième tableau représente les paramètres de ta function :
Bonjour je me permet de déterrer cet ancien sujet mais j'aimerais savoir comment avez-vous fait afin de palier ce problème et continuer de suivre le tuto dans de meilleures conditions. Merci
Bonjour
J'ai toujours un problème avec Zend Expressive Fast Route. J'ai essayé de faire comme Lucas Tambarin, mais il y a un problème qui se pose. Dans la fonction macth, la méthode getCallback n'existe pas:
J'utilise la version 3.0.2
Si quelqu'un peut bien m'aider
Si tu es dans la formation de Grafikart (https://www.grafikart.fr/tutoriels/router-919) il dit clairement sous la vidéo de limiter la version de Fast Route:
composer require zendframework/zend-expressive-fastroute:1.2.0
Aussi ne remonte pas un sujet aussi vieux c'est pas le plus judicieux imho
Je vais fermer le sujet, car j'ai plus le temps pour travailler sur mon framework.
Je vais fermer le sujet, car j'ai plus le temps pour travailler sur mon framework.
Merci de votre aide.
Sinon il y a altorouter qui est vraiment très très bien :)
Desolée de relancer le sujet merci a @Lucas Tambarin.
pour l'aide.
pour les personne qui on l'erreur:
Le probleme vient qui la function call_user_func_array qui a besoin d'une closure. dans le fichier App ligne 56 on lui donne une instance de MiddlewareApp et non une closure.
donc:
pour la function match :
et pour la function run :