Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je débute en ZF3 et je suis en train de développer un site web avec 3 niveaux d'accès : public, utilisateur et admin.
Ma problématique concerne le menu qui doit changer selon le profil de l'utilisateur.
Ce menu est généré par 'Zend\Navigation' qui fonctionne sans problèmes mais qui ne permet pas de prendre en compte le profil de l'utilisateur.
Mon idée : créer un view helper personalisé, y appeler Zend\Navigation et récupérer le profil de l'utilisateur.
Et c'est là que ça coince.
J'ai tout d'abord créer la factory pour le view helper personalisé :
[lang=php] <?php namespace User\View\Helper\Factory; use Interop\Container\ContainerInterface; use Zend\ServiceManager\Factory\FactoryInterface; use Zend\Authentication\AuthenticationService; class MenuFactory implements FactoryInterface { public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { $authenticationService = $container->get(\Zend\Authentication\AuthenticationService::class);; $entityManager = $container->get('doctrine.entitymanager.orm_default'); return new MenuFactory($authenticationService, $entityManager); } }
La construction de la classe Menu est déclaré dans module.config.php :
[lang=php] 'view_helpers' => [ 'factories' => [ View\Helper\Menu::class => View\Helper\Factory\MenuFactory::class ], 'aliases' => [ 'mainMenu' => View\Helper\Menu::class ] ],
Vient ensuite le Menu lui même :
[lang=php] <?php namespace User\View\Helper; use Zend\View\Helper\AbstractHelper; use Zend\View\Helper\Navigation; class Menu extends AbstractHelper { /** * Authentication service. * @var \Zend\Authentication\AuthenticationService */ private $authService; /** * @var Doctrine\ORM\EntityManager */ private $entityManager; /** * Constructor. * @param array $items Menu items. */ public function __construct($authService, $entityManager) { $this->authService = $authService; $this->entityManager = $entityManager; } public function render() { $result = "test"; return $result; } }
J'importe authService et entityManager car c'est de cette façon que je peux accéder au status de l'utilisateur (mais s'il y a plus simple, je suis preneur).
L'idée sera de générer le menu en fonction du profil de l'utilisateur dans la méthode render() (bien qu'encore, je n'ai pas testé l'importation de Zend\Navigation dans cette classe, mais chaque chose en son temps !).
Dans l'immédiat, je bloque sur cette erreur :
Catchable fatal error: Argument 1 passed to User\View\Helper\Factory\MenuFactory::__invoke() must implement interface Interop\Container\ContainerInterface, none given in H:\Developpement web\Workspace\Test\module\User\src\View\Helper\Factory\MenuFactory.php on line 19
Mes questions :
1) pourquoi il refuse ma construction de classe ? J'en ai pleins d'autres sous ce module déclarées de la même façon et qui fonctionne bien ? Est-ce parce que Menu est un view_helper ?
2) Y-a-t-il une solution plus simple pour récupérer le profil de l'utilisateur qui est loggé ? J'utilise le système de gestion des utilisateurs décris dans ce livre :
https://olegkrivtsov.github.io/using-ze … ering.html
3) Je pense que cette méthode va à l'encontre du modèle MVC, mais y-a-t-il moyen de récupérer le profil de l'utilisateur enregistré directement dans phtml. Je suis tombé par hasard sur $this->identity() qui retourne l'identité de l'utilisateur. Y-a-t-il moyen d'accéder à d'autres informations? Dans ce cas, j'oublie toute cette histoire de view helper personalisé et je place un simple if dans le layout qui teste le profil de l'utilisateur. Mais c'est moche, je vous l'accorde.
Merci pour votre réponse.
Dernière modification par Mulot (25-11-2016 11:43:02)
Hors ligne
Bonjour Mulot,
as tu résolu ton problème? ou as tu avancé dans tes recherches?
En survolant ton code j'ai remarqué une erreur dans ta class Menufactory
remplace :
[lang=php] return new MenuFactory($authenticationService, $entityManager);
par :
[lang=php] return new Menu($authenticationService, $entityManager);
Ensuite il me semble que le composant Zend-Navigation permet la gestion des acl (les droits des utilisateurs), et également d'afficher un menu selon son nom
Shishi
Hors ligne