Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je souhaite passer toutes les applications web de ma société de ZF1 à ZF2.
Après de longue lecture, j'ai encore quelques difficultés à appréhender la construction d'un module, etc....
J'ai un besoin spécifique pour toutes ces applications et particulièrement au niveau de l'authentification.
J'ai tout d'abord créer un nouvel adaptateur d'authentification \MyUser\Authentication\Adapter\DbTable
et un nouvel adaptateur de stockage \MyUser\Authentication\Storage\Session
Voici comment cela se présente
[lang=php]//Module.php <?php class Module { //.... public function getServiceConfig() { return array( 'invokables' => array( 'MyUser\Form\Login' => 'MyUser\Form\Login', 'MyUser\Authentication\Storage\Session' => 'MyUser\Authentication\Storage\Session', ), 'factories' => array( 'MyUserOptions' => function ($sm) { $config = $sm->get('Config'); return new Options\ModuleOptions(isset($config['MyUser']) ? $config['MyUser'] : array()); }, 'MyUserAuthStorage' => function($sm) { $options = $sm->get('MyUserOptions'); return new \MyUser\Authentication\Storage\Session('sdauth'); }, 'MyUserAuthService' => function ($sm) { $dbAdapter = $sm->get('bigdataSdv1'); $authAdapter = new \MyUser\Authentication\Adapter\DbTable($dbAdapter, 'utilisateurs', 'login', 'password', '?'); //$authAdapter = new \Zend\Authentication\Adapter\DbTable($dbAdapter, 'utilisateurs', 'login', 'password', '?'); $authService = new \Zend\Authentication\AuthenticationService(); $authService->setAdapter($authAdapter); $authService->setStorage($sm->get('MyUserAuthStorage')); return $authService; }, ), ); } public function getViewHelperConfig() { return array( 'factories' => array( 'MyUserDisplayName' => function ($sm) { $locator = $sm->getServiceLocator(); $viewHelper = new View\Helper\MyUserDisplayName; $viewHelper->setAuthService($locator->get('MyUserAuthService')); return $viewHelper; }, ), ); } public function onBootstrap(MvcEvent $e) { $em = $e->getApplication()->getEventManager(); //Check Authentication $em->attach('route', array($this, 'checkAuthenticated')); //Override Layout //$em->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController', 'dispatch', array($this, 'overrideLayout'), 100); $em->attach('dispatch', array($this, 'overrideLayout')); } /** * Override layout for action "login" and "logout" * @param MvcEvent $e */ public function overrideLayout(MvcEvent $e) { //$controller = $e->getTarget(); //$controllerClass = get_class($controller); //$moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\')); $routeMatch = $e->getRouteMatch(); if ( in_array($routeMatch->getParam('action'), array('login','logout') ) ) { $controller = $e->getTarget(); $controller->layout('layout/layout.phtml'); } } /** * Return true if "login" or "logout" Action is open * @param MvcEvent $e * @return boolean */ public function isOpenRequest(MvcEvent $e) { $routeMatch = $e->getRouteMatch(); if ( in_array($routeMatch->getParam('action'), array('login','logout') ) ) { return true; } return false; } /** * Check if the user is authenticated * @param MvcEvent $e */ public function checkAuthenticated(MvcEvent $e) { if ( !$this->isOpenRequest($e) ) { $sm = $e->getApplication()->getServiceManager(); if (! $sm->get('MyUserAuthService')->getStorage()->read($sm->get('MyUserAuthService')->getStorage()->getSessionId())) { $e->getRouteMatch() ->setParam('controller', 'MyUser\Controller\User') ->setParam('action', 'login'); } } } }
A partir de là je pense qu'il y a déjà des choses à améliorer. Mais en plus je souhaiterais pouvoir avoir plusieurs adaptateurs d'authentification et de stockage différents suivant les applications.
En fonction de la configuration des applications certaines doivent pourvoir se connecter à partir d'une base de données ou à partir d'une api. De même pour le stockage qui peut être uniquement en Session ou en Session + Database.
Si quelqu'un à des conseils ou des explications pour m'orienter cela serait appréciable.
Hors ligne
Salut, déjà il faut éviter de mettre la config dans le Module.php (c'est vraiment quand il n'y a pas d'autres solutions).
Je te conseil donc de déporter "serviceConfig" et "viewHelperConfig" dans module.config.php. Ensuite je te conseil aussi de faire des classes factory plutôt que des fonctions anonymes. C'est plus propre et si tu pourras mettre ta configuration en cache.
Sinon à vu d'oeil le code a l'air plutôt propre (penses à faire des imports, avec les namespace ça évite d'avoir des noms de classes à rallonge).
De même dans onBootstrap tu as plus ou moins la bonne méthode pour attacher des évènements par contre de la même manière créé plutôt une classe Listener que tu vas attacher c'est aussi plus propre et du coup tu aurras des méthodes overrideLayout, isOpenRequest et checkAuthenticated dans ces classes Listener plutôt que dans le Module.php. Si c'est une grosse application ça risque de devenir le foutoir.
Concernant les adapters je pense que le mieux c'est d'avoir des entrées différentes dans le service manager pour une même application puisque la configuration est mergée entre tous les modules. Dans le cas contraire tu peux utiliser un système d'alias qui pointe vers l'un ou l'autre adapter (si t'as un module générique qui propose tous tes adapters et que tu n'en as besoin que d'un seul par application). Un peu comme l'authenticationService quand tu veux utiliser celui de doctrine.
Hors ligne
Merci pour la réponse,
J'avais compris que pour des raisons de performance, il fallait supprimer tout les ....Config du Module.php et éviter les fonctions anonymes.
Et c'est là que cela bloque.......
Je n'arrive pas encore à me représenter comment organiser mon module et donc travailler avec des classes Factory, Listerner, ...
Est ce que mon problème ne viendrait pas que je n'arrive pas encore à appréhender correctement l'injection de dépendance, ..., développement par contrat
Est ce qu'il existe un exemple basique qui recense des pré-requis, convention de nommage qui peuvent m'aider ?
Hors ligne
Tu devrais pouvoir avoir un début de réponse ici : https://github.com/Grafikart/BlogMVC/tr … Framework2
Hors ligne