PageRenderTime 46ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/module/User/src/User/Module.php

https://bitbucket.org/buonaparte/zfalbum
PHP | 281 lines | 189 code | 34 blank | 58 comment | 1 complexity | 680868d7ca4ea90ecbe67fb0521b870a MD5 | raw file
  1. <?php
  2. namespace User;
  3. use BnpBase\Authentication\Adapter\MapperAdapter;
  4. use BnpBase\Mapper\Adapter\DoctrineAdapter;
  5. use BnpBase\Mapper\BaseMapper;
  6. use BnpBase\Mapper\BaseMapperInterface;
  7. use Doctrine\Common\Persistence\ObjectManager;
  8. use Doctrine\ORM\EntityManager;
  9. use DoctrineModule\Stdlib\Hydrator\DoctrineObject;
  10. use User\Controller\ManagementController;
  11. use User\Controller\UserController;
  12. use User\Entity\User;
  13. use User\EventManager\UserMapperListenerAggregate;
  14. use User\Form\LoginUser;
  15. use User\Form\RegisterUser;
  16. use User\Service\PasswordManager;
  17. use Zend\Authentication\Adapter\AdapterInterface;
  18. use Zend\Authentication\AuthenticationService;
  19. use Zend\Authentication\Storage\Session;
  20. use Zend\Authentication\Storage\StorageInterface;
  21. use Zend\Config\Config;
  22. use Zend\Crypt\Password\Bcrypt;
  23. use Zend\EventManager\EventInterface;
  24. use Zend\EventManager\ListenerAggregateInterface;
  25. use Zend\EventManager\SharedEventManager;
  26. use Zend\Form\FormElementManager;
  27. use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
  28. use Zend\ModuleManager\Feature\BootstrapListenerInterface;
  29. use Zend\ModuleManager\Feature\ConfigProviderInterface;
  30. use Zend\ModuleManager\Feature\ControllerProviderInterface;
  31. use Zend\ModuleManager\Feature\FormElementProviderInterface;
  32. use Zend\ModuleManager\Feature\ServiceProviderInterface;
  33. use Zend\Mvc\Controller\ControllerManager;
  34. use Zend\Mvc\MvcEvent;
  35. use Zend\Navigation\Page\AbstractPage;
  36. use Zend\ServiceManager\ServiceLocatorInterface;
  37. use Zend\Session\Storage\SessionStorage;
  38. use Zend\Stdlib\Hydrator\ClassMethods;
  39. use Zend\Stdlib\Hydrator\HydratorInterface;
  40. use ZfcRbac\Service\Rbac;
  41. class Module implements
  42. ConfigProviderInterface,
  43. FormElementProviderInterface,
  44. ControllerProviderInterface,
  45. ServiceProviderInterface,
  46. AutoloaderProviderInterface,
  47. BootstrapListenerInterface
  48. {
  49. /**
  50. * Returns configuration to merge with application configuration
  51. *
  52. * @return array|\Traversable
  53. */
  54. public function getConfig()
  55. {
  56. return include __DIR__.'/../../config/module.config.php';
  57. }
  58. /**
  59. * Expected to return \Zend\ServiceManager\Config object or array to seed
  60. * such an object.
  61. *
  62. * @return array|\Zend\ServiceManager\Config
  63. */
  64. public function getControllerConfig()
  65. {
  66. return array(
  67. 'factories' => array(
  68. 'User\Controller\User' => function (ControllerManager $cm) {
  69. /** @var $sm ServiceLocatorInterface */
  70. $sm = $cm->getServiceLocator();
  71. /** @var $mapper BaseMapperInterface */
  72. $mapper = $sm->get('User\Mapper\User');
  73. /** @var $fm FormElementManager */
  74. $fm = $sm->get('FormElementManager');
  75. /** @var $registerForm RegisterUser */
  76. $registerForm = $fm->get('User\Form\RegisterUser');
  77. $controller = new UserController($mapper);
  78. $controller->setRegisterForm($registerForm);
  79. return $controller;
  80. },
  81. 'User\Controller\Management' => function (ControllerManager $cm) {
  82. /** @var $sm ServiceLocatorInterface */
  83. $sm = $cm->getServiceLocator();
  84. /** @var $mapper BaseMapperInterface */
  85. $mapper = $sm->get('User\Mapper\User');
  86. $controller = new ManagementController($mapper);
  87. return $controller;
  88. }
  89. )
  90. );
  91. }
  92. /**
  93. * Expected to return \Zend\ServiceManager\Config object or array to
  94. * seed such an object.
  95. *
  96. * @return array|\Zend\ServiceManager\Config
  97. */
  98. public function getFormElementConfig()
  99. {
  100. return array(
  101. 'factories' => array(
  102. 'User\Form\RegisterUser' => function (FormElementManager $fm) {
  103. /** @var $mapper BaseMapperInterface */
  104. $mapper = $fm->getServiceLocator()->get('User\Mapper\User');
  105. /** @var $hydrator HydratorInterface */
  106. $hydrator = $fm->getServiceLocator()->get('User\Form\UserHydrator');
  107. $form = new RegisterUser($mapper);
  108. $form->setHydrator($hydrator);
  109. return $form;
  110. },
  111. 'User\Form\LoginUser' => function (FormElementManager $fm) {
  112. /** @var $authAdapter MapperAdapter */
  113. $authAdapter = $fm->getServiceLocator()->get('User\Service\Auth\Adapter');
  114. return new LoginUser($authAdapter);
  115. }
  116. )
  117. );
  118. }
  119. /**
  120. * Expected to return \Zend\ServiceManager\Config object or array to
  121. * seed such an object.
  122. *
  123. * @return array|\Zend\ServiceManager\Config
  124. */
  125. public function getServiceConfig()
  126. {
  127. return array(
  128. 'factories' => array(
  129. 'User\Form\UserHydrator' => function (ServiceLocatorInterface $sm) {
  130. /** @var $em ObjectManager */
  131. $em = $sm->get('doctrine.entitymanager.orm_default');
  132. return new DoctrineObject($em, 'User\Entity\User');
  133. },
  134. 'User\Mapper\User' => function (ServiceLocatorInterface $sm) {
  135. /** @var $em EntityManager */
  136. $em = $sm->get('doctrine.entitymanager.orm_default');
  137. /** @var $listener UserMapperListenerAggregate */
  138. $listener = $sm->get('User\EventManager\UserMapperListenerAggregate');
  139. $baseMapper = new BaseMapper(new DoctrineAdapter($em, 'User\Entity\User'));
  140. $baseMapper->setEntityPrototype(new User());
  141. $baseMapper->getEventManager()->attachAggregate($listener);
  142. return $baseMapper;
  143. },
  144. 'Bcrypt' => function (ServiceLocatorInterface $sm) {
  145. $service = new Bcrypt();
  146. $service->setCost(10);
  147. return $service;
  148. },
  149. 'User\Service\PasswordManager' => function (ServiceLocatorInterface $sm) {
  150. /** @var $crypt Bcrypt */
  151. $crypt = $sm->get('Bcrypt');
  152. return new PasswordManager($crypt);
  153. },
  154. 'User\EventManager\UserMapperListenerAggregate' => function (ServiceLocatorInterface $sm) {
  155. /** @var $pm PasswordManager */
  156. $pm = $sm->get('User\Service\PasswordManager');
  157. return new UserMapperListenerAggregate($pm);
  158. },
  159. 'User\Service\Auth\Storage' => function (ServiceLocatorInterface $sm) {
  160. return new Session('zf_album');
  161. },
  162. 'User\Service\Auth\Adapter' => function (ServiceLocatorInterface $sm) {
  163. /** @var $mapper BaseMapper */
  164. $mapper = $sm->get('User\Mapper\User');
  165. $adapter = new MapperAdapter($mapper);
  166. $adapter->setIdentityHydrator(new ClassMethods());
  167. $adapter->setIdentityClass('User\Entity\UserInterface');
  168. $adapter->setIdentityField('username');
  169. $adapter->setCredentialField('password');
  170. /** @var $pm PasswordManager */
  171. $pm = $sm->get('User\Service\PasswordManager');
  172. $adapter->setCredentialChecker(function ($plain, $hash) use ($pm) {
  173. return $pm->checkPassword($plain, $hash);
  174. });
  175. return $adapter;
  176. },
  177. 'AuthService' => function (ServiceLocatorInterface $sm) {
  178. /** @var $adapter AdapterInterface */
  179. $adapter = $sm->get('User\Service\Auth\Adapter');
  180. /** @var $storage StorageInterface */
  181. $storage = $sm->get('User\Service\Auth\Storage');
  182. return new AuthenticationService(
  183. $storage,
  184. $adapter
  185. );
  186. }
  187. ),
  188. 'invokables' => array(
  189. 'User\EventManager\DispatchErrorListenerAggregate' => 'User\EventManager\DispatchErrorListenerAggregate'
  190. ),
  191. 'aliases' => array(
  192. 'Zend\Authentication\AuthenticationService' => 'AuthService'
  193. )
  194. );
  195. }
  196. /**
  197. * Return an array for passing to Zend\Loader\AutoloaderFactory.
  198. *
  199. * @return array
  200. */
  201. public function getAutoloaderConfig()
  202. {
  203. return array(
  204. 'Zend\Loader\StandardAutoloader' => array(
  205. 'namespaces' => array(
  206. __NAMESPACE__ => __DIR__,
  207. 'ZfcRbac' => __DIR__.'/../../../../vendor/zf-commons/zfc-rbac'
  208. )
  209. )
  210. );
  211. }
  212. /**
  213. * Listen to the bootstrap event
  214. *
  215. * @param EventInterface $e
  216. * @return array
  217. */
  218. public function onBootstrap(EventInterface $e)
  219. {
  220. /** @var $e MvcEvent */
  221. /** @var $sharedEventManager SharedEventManager */
  222. $sharedEventManager = $e->getApplication()->getEventManager()->getSharedManager();
  223. $sharedEventManager->attach(
  224. 'Zend\View\Helper\Navigation\AbstractHelper',
  225. 'isAllowed',
  226. array($this, 'isAllowed')
  227. );
  228. /** @var $dispatchErrorListener ListenerAggregateInterface */
  229. $dispatchErrorListener = $e->getApplication()->getServiceManager()
  230. ->get('User\EventManager\DispatchErrorListenerAggregate');
  231. $e->getApplication()->getEventManager()->attachAggregate($dispatchErrorListener);
  232. }
  233. public function isAllowed(EventInterface $e)
  234. {
  235. $e->stopPropagation(true);
  236. /** @var $sm ServiceLocatorInterface */
  237. $sm = $e->getTarget()->getServiceLocator()->getServiceLocator();
  238. /** @var $rbac Rbac */
  239. $acl = $sm->get('ZfcRbac\Service\Rbac');
  240. /** @var $page AbstractPage */
  241. $page = $e->getParam('page');
  242. if (! $permission = $page->getPermission()) {
  243. return true;
  244. }
  245. return $acl->isGranted($permission);
  246. }
  247. }