Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 16-07-2014 19:01:01

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Route qui n'existe pas renvoient une runtime exception non attrapée

Rebonjour,
Voilà depuis que j'ai mis en place un système de route par l'url et donc un paramètre lang dès que je met mes bonnes routes c'est niquel. Mais si jamais je met une route qui n'existe pas
j'ai une fatal error avec une runtime exception qui n'est pas attrapée par le framework.

J'aimerai savoir comment régler le problème s'il vous plait.

application.config.php :

Code:

[lang=php]
'routes' => array(
            'home' => array(
                'type' => 'Segment',
                'options' => array(
                    'route'    => '/:lang',
                    'constraints' => array(
                         'lang' => '[a-z]{2}',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                        'lang'      => 'fr'
                    ),
                ),
            ),

Module.php

Code:

[lang=php]
        $routeCallback = function ($e) {
            $availableLanguages = array ('fr', 'en');
            $defaultLanguage = 'en';
            $language = "";
            $fromRoute = false;
            //see if language could be find in url
            if ($e->getRouteMatch()->getParam('lang')) {
                $language = $e->getRouteMatch()->getParam('lang');
                $fromRoute = true;

                //or use language from http accept
            } else {
                $headers = $e->getApplication()->getRequest()->getHeaders();
                if ($headers->has('Accept-Language')) {
                    $headerLocale = $headers->get('Accept-Language')->getPrioritized();
                    $language = substr($headerLocale[0]->getLanguage(), 0,2);
                }
            }
            if(!in_array($language, $availableLanguages) ) {
                $language = $defaultLanguage;
            }
            $e->getApplication()->getServiceManager()->get('translator')->setLocale($language);

        };

        $eventManager->attach(\Zend\Mvc\MvcEvent::EVENT_ROUTE, $routeCallback);

et dans la vue je peux changer la langue comme je veux avec ceci :

layout.phtml :

Code:

[lang=php]
<ul class="dropdown-menu">
                                <li><a href="<?= $this->url($this->route, array('lang' => 'fr'));?>">
                                    <span class="flag fr"></span> Français
                                </a></li>
                                <li><a href="<?=$this->url($this->route, array('lang' => 'en'));?>">
                                    <span class="flag gb"></span> English
                                </a></li>
                            </ul>

Tout marche bien donc quand je me met dans les routes prédéfinies, mais dès que j'ai une routeMatch a null donc qui n'existe pas c'est le festival de la sauvagerie dans mon code et pouf la belle errur orange...

Un petit coup de main serait pas de refus s'il vous plait.

Dernière modification par JGreco (16-07-2014 19:44:15)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#2 17-07-2014 13:11:22

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Route qui n'existe pas renvoient une runtime exception non attrapée

Bonjour smile

J'ai trouvé d'ou le problème venait: en réalité, la vue layout.phtml utilise donc le $this->route est c'est cela qui provoque l'erreur quand la route est fausse.

Comment s'en prévaloir et corriger cela s'il vous plait ?


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#3 18-07-2014 00:03:53

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Route qui n'existe pas renvoient une runtime exception non attrapée

Salut je te conseil de faire directement une classe de Listener pour gérer ton event ça t'évitera un fichier Module.php énorme et sale smile.

Il est possible que ma mémoire me joue des tours mais $this->route c'est toi qui le passe toi même à ton layout non ? Dans ce cas au moment où tu le passes au layout et tu test sa valeur. Si c'est null alors tu lui mets une valeur par défaut qui te convient ou tu n'affiches tout simplement pas ta liste en faisant un petit test dans ton layout wink.

Hors ligne

 

#4 18-07-2014 09:28:52

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Route qui n'existe pas renvoient une runtime exception non attrapée

Salut Orkin et merci pour ta réponse, toutefois je n'ai encore jamais compris les listeners dans zf2 c'est con mais je sais pas trop encore en quoi ça consiste. Ni comment l'implémenter.

Pour ce qui est de $this->route, c'est passé automatiquement au layout et cela ne viens pas de moi. J'ai pensé à utiliser dans le layout le getHelperPluginManager pour récupérer getRouteMatch et checker si elle est vide ou pas, mais après pour garder les route par rapport a la langue choisis il faut que je refasse cela partout... et j'ai pas vraiment trouvé beaucoup d'infos sur une bonne manière de faire cela par les routes plutôt que par la session.


Merci de ton aide en tous cas.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#5 18-07-2014 10:51:29

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Route qui n'existe pas renvoient une runtime exception non attrapée

En gros les listeners c'est exactement ce que tu as fait dans ton Module.php avec la fonction de callback. En gros tu attaches à un évènement une fonction à exécuter (avec une priorité ou non, c'est utile quand tu en as plusieurs pour que ça se fasse dans le bon ordre wink).
Donc là tu définies une callback et un évènement sur lequel est déclenché la callback. Un listener c'est la même chose, la seule différence c'est que tu délègues tout dans une classe.
Une classe Listener va implémenté l'interface ListenerAggregateInterface et ensuite tu implémente ce que l'interface te demande smile. Tu as une fonction attach qui va te permettre d'attacher des callback à des évènements et une fonction detach qui fait l'inverse (tu as des exemples dans la doc normalement). Il faut savoir que la fonction de callback tu peux la passer de deux manières sois comme tu le fais en passant une fonction anonyme mais ça devient vite le bordel soit en lui passant un context et un nom de fonction. C'est là qu'une classe de Listener devient intéressante car tu peux en créer une par domaine métier ou par type d'évènement auquels tes callback sont attachés. Dans la classe tu vas définir des fonctions normales auquel on va passer un Event (EventInterface) du coup ta fonction attach est très propre et tout est délégué. Voici un exemple ça sera probablement plus clair :

Code:

[lang=php]
public function attach(EventManagerInterface $events)
    {
        $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'majUser'), 101); // context c'est $this donc le Listener (pour savoir où se trouve la fonction a appeler), majUser c'est la fonction, 101 la priorité
        $this->listeners[] = $events->attach(MvcEvent::EVENT_ROUTE, array($this, 'jGreco')); // exemple avec ton code
    }

public function jGreco(EventInterface $e)
    {
        $availableLanguages = array ('fr', 'en');
        $defaultLanguage = 'en';
        $language = "";
        $fromRoute = false;
        //see if language could be find in url
        if ($e->getRouteMatch()->getParam('lang')) {
            $language = $e->getRouteMatch()->getParam('lang');
            $fromRoute = true;
 
            //or use language from http accept
        } else {
            $headers = $e->getApplication()->getRequest()->getHeaders();
            if ($headers->has('Accept-Language')) {
                $headerLocale = $headers->get('Accept-Language')->getPrioritized();
                $language = substr($headerLocale[0]->getLanguage(), 0,2);
            }
        }
        if(!in_array($language, $availableLanguages) ) {
            $language = $defaultLanguage;
        }
        $e->getApplication()->getServiceManager()->get('translator')->setLocale($language);
    }

Pour ta route tu peux faire genre dans ton layout if ($this->route) { /* tu l'utilises sinon tu fais rien :p */ }

Hors ligne

 

#6 18-07-2014 11:12:04

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Route qui n'existe pas renvoient une runtime exception non attrapée

Merci Orkin,
C'est encore un peu flou mais y a quelques éclaircies, en gros un listener(je vais reformuler ton explication pour voir si je suis bien) c'est une fonction qui sera appelée dès qu'un événement sera "écouté" par l'appli ? Soit par une action utilisateur, et/ou par la modification d'un objet  par exemple ?

Mais comment l'appeler dans la config il y a une clé spécifique pour déclarer un listener ? comment je l'appelle et ou ? Et l'instantiation se fait automatiquement par une factory ?
Un listener se met dans un dossier listeners dans src/ par exemple ?


Et pour ma route, si je le fait dans le layout par exemple, est ce que dans mes vues de tous les modules je devrait refaire le test ou pas besoin ?

Merci en tous cas pour ces infos c'est très précieux !


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#7 18-07-2014 13:06:00

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Route qui n'existe pas renvoient une runtime exception non attrapée

Non un Listener comme son nom l'indique ça écoute un évènement et il est déclenché lorsque le ZF2 (ou ton code) lance cet évènement smile. Donc ça peut être déclenché par n'importe quoi. Par exemple j'ai un module qui me permet de gérer l'envoi de mes mails et j'ai un module User qui me permet de gérer les utilisateurs. Généralement le module User je le ré-utilise dans différentes application et certaines envoies des mails et d'autres non. Pour éviter d'avoir à tout réécrire etc ... Lors de l'inscription d'un utilisateur je lance un évènement (trigger) qui est écouté par la configuration de mon module Mail. De cette façon si le module Mail est présent le mail est envoyé sinon rien ne se passe. L'évènement est lancé mais comme aucun Listener ne l'écoute il ne se passe rien et ça ne plante pas smile.

Moi je fais l'instanciation dans le Module.php dans la fonction onBootstrap. Faut que tu regardes il me semble qu'on peut le faire via la configuration mais j'ai pas cherché plus que ça vu que j'ai qu'un ou deux Listener par module généralement je me prend pas la tête. Tu peux le créer via une factory dans le tableau 'service_manager' et ensuite récupérer l'instance de ton Listener via le ServiceLocator qui tu vas ensuite attacher à ton EventManager. Tu peux le mettre où tu veux avec les namespace wink. Perso je le met dans un dossier Listener mais après chacun peut faire comme il veut c'est comme pour les services.

Bah ça dépend si tu l'utilises dans tes vues oui t'auras pas le choix sinon non.

Hors ligne

 

#8 19-07-2014 19:07:53

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Route qui n'existe pas renvoient une runtime exception non attrapée

Bonjour,
J'ai appliqué ce que tu as dit et j'ai presque tout compris. J'ai appliqué tout cela à l'affichage des flashs messages qui étaient dans le onBootstrap et que j'ai donc mis dans un listener.
Donc j'ai plutôt bien compris, grâce à toi comment ça fonctionne, pour ça merci beaucoup.

Maintenant, faire cela m'a un peu remis en question le fait de faire un changement de la langue du site de cette manière, avant je faisait la modification par la session et l'url restait la même, en quoi est-ce mieux de le faire par l'url ?


Si dans tes projets tu fait des sites multi-langages pour quelle option optes tu et pourquoi ?


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages