Version 0.5.5
[userbundle] / Controller / AbstractController.php
index c29690398f86942ef71b04f13751a769f6c4c621..77cf860f4d59bcc66dc67fefd4ddb2e384d3fff4 100644 (file)
 
 namespace Rapsys\UserBundle\Controller;
 
+use Doctrine\ORM\EntityManagerInterface;
+use Doctrine\Persistence\ManagerRegistry;
+
+use Rapsys\PackBundle\Util\SluggerUtil;
+
+use Rapsys\UserBundle\RapsysUserBundle;
+
+use Psr\Container\ContainerInterface;
 use Psr\Log\LoggerInterface;
+
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as BaseAbstractController;
 use Symfony\Bundle\FrameworkBundle\Controller\ControllerTrait;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Bundle\SecurityBundle\Security;
+use Symfony\Component\Form\FormFactoryInterface;
+use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Mailer\MailerInterface;
+use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Routing\RouterInterface;
-use Symfony\Component\Translation\TranslatorInterface;
+use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
+use Symfony\Component\Security\Core\User\UserInterface;
+use Symfony\Contracts\Cache\CacheInterface;
 use Symfony\Contracts\Service\ServiceSubscriberInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
 
-use Rapsys\UserBundle\RapsysUserBundle;
+use Twig\Environment;
 
 /**
- * Provides common features needed in controllers.
- *
  * {@inheritdoc}
+ *
+ * Provides common features needed in controllers.
  */
 abstract class AbstractController extends BaseAbstractController implements ServiceSubscriberInterface {
-       use ControllerTrait {
-               //Rename render as baseRender
-               render as protected baseRender;
-       }
-
-       ///Config array
-       protected $config;
+       /**
+        * Alias string
+        */
+       protected string $alias;
 
-       ///ContainerInterface instance
-       protected $container;
+       /**
+        * Config array
+        */
+       protected array $config;
 
-       ///Context array
-       protected $context;
+       /**
+        * Context array
+        */
+       protected array $context;
 
-       ///Router instance
-       protected $router;
+       /**
+        * Locale string
+        */
+       protected string $locale;
 
-       ///Translator instance
-       protected $translator;
+       /**
+        * Page integer
+        */
+       protected int $page;
 
-       ///Locale
-       protected $locale;
+       /**
+        * Request instance
+        */
+       protected Request $request;
 
        /**
-        * Common constructor
-        *
-        * Stores container, router and translator interfaces
-        * Stores config
-        * Prepares context tree
+        * Abstract constructor
         *
+        * @param CacheInterface $cache The cache instance
+        * @param AuthorizationCheckerInterface $checker The checker instance
         * @param ContainerInterface $container The container instance
+        * @param ManagerRegistry $doctrine The doctrine instance
+        * @param FormFactoryInterface $factory The factory instance
+        * @param UserPasswordHasherInterface $hasher The password hasher instance
+        * @param LoggerInterface $logger The logger instance
+        * @param MailerInterface $mailer The mailer instance
+        * @param EntityManagerInterface $manager The manager instance
+        * @param RouterInterface $router The router instance
+        * @param Security $security The security instance
+        * @param SluggerUtil $slugger The slugger instance
+        * @param RequestStack $stack The stack instance
+        * @param TranslatorInterface $translator The translator instance
+        * @param Environment $twig The twig environment instance
+        * @param integer $limit The page limit
         */
-       public function __construct(ContainerInterface $container) {
+       public function __construct(protected CacheInterface $cache, protected AuthorizationCheckerInterface $checker, protected ContainerInterface $container, protected ManagerRegistry $doctrine, protected FormFactoryInterface $factory, protected UserPasswordHasherInterface $hasher, protected LoggerInterface $logger, protected MailerInterface $mailer, protected EntityManagerInterface $manager, protected RouterInterface $router, protected Security $security, protected SluggerUtil $slugger, protected RequestStack $stack, protected TranslatorInterface $translator, protected Environment $twig, protected int $limit = 5) {
                //Retrieve config
-               $this->config = $container->getParameter(RapsysUserBundle::getAlias());
+               $this->config = $container->getParameter($this->alias = RapsysUserBundle::getAlias());
 
-               //Set the container
-               $this->container = $container;
-
-               //Set the router
-               $this->router = $container->get('router');
-
-               //Set the translator
-               $this->translator = $container->get('translator');
+               //Get current request
+               $this->request = $stack->getCurrentRequest();
 
-               //Get request stack
-               $stack = $this->container->get('request_stack');
+               //Get current page
+               $this->page = (int) $this->request->query->get('page');
 
-               //Get current request
-               $request = $stack->getCurrentRequest();
+               //With negative page
+               if ($this->page < 0) {
+                       $this->page = 0;
+               }
 
                //Get current locale
-               $this->locale = $request->getLocale();
-
-               //Set locale
-               $this->config['context']['locale'] = str_replace('_', '-', $this->locale);
+               $this->locale = $this->request->getLocale();
 
                //Set translate array
                $translates = [];
@@ -95,10 +123,12 @@ abstract class AbstractController extends BaseAbstractController implements Serv
                        foreach($this->config['translate'] as $translate) {
                                //Set tmp
                                $tmp = null;
+
                                //Iterate on keys
                                foreach(array_reverse(explode('.', $translate)) as $curkey) {
                                        $tmp = array_combine([$curkey], [$tmp]);
                                }
+
                                //Append tree
                                $translates = array_replace_recursive($translates, $tmp);
                        }
@@ -106,12 +136,6 @@ abstract class AbstractController extends BaseAbstractController implements Serv
 
                //Inject every requested route in view and mail context
                foreach($this->config as $tag => $current) {
-                       //Look for entry with title subkey
-                       if (!empty($current['title'])) {
-                               //Translate title value
-                               $this->config[$tag]['title'] = $this->translator->trans($current['title']);
-                       }
-
                        //Look for entry with route subkey
                        if (!empty($current['route'])) {
                                //Generate url for both view and mail
@@ -179,7 +203,7 @@ abstract class AbstractController extends BaseAbstractController implements Serv
                                                                }
 
                                                                //Translate tmp value
-                                                               $tmp = $this->translator->trans($tmp);
+                                                               $tmp = $this->translator->trans($tmp, [], $this->alias);
 
                                                                //Iterate on keys
                                                                foreach(array_reverse($keys) as $curkey) {
@@ -198,13 +222,13 @@ abstract class AbstractController extends BaseAbstractController implements Serv
                                                        $pathInfo = $this->router->getContext()->getPathInfo();
 
                                                        //Iterate on locales excluding current one
-                                                       foreach($this->config['locales'] as $locale) {
+                                                       foreach(($locales = array_keys($this->config['default']['languages'])) as $locale) {
                                                                //Set titles
                                                                $titles = [];
 
                                                                //Iterate on other locales
-                                                               foreach(array_diff($this->config['locales'], [$locale]) as $other) {
-                                                                       $titles[$other] = $this->translator->trans($this->config['languages'][$locale], [], null, $other);
+                                                               foreach(array_diff($locales, [$locale]) as $other) {
+                                                                       $titles[$other] = $this->translator->trans($this->config['default']['languages'][$locale], [], $this->alias, $other);
                                                                }
 
                                                                //Retrieve route matching path
@@ -220,13 +244,14 @@ abstract class AbstractController extends BaseAbstractController implements Serv
                                                                if ($locale == $this->locale) {
                                                                        //Set locale locales context
                                                                        $this->config[$tag][$view]['context']['canonical'] = $this->router->generate($name, ['_locale' => $locale]+$route, UrlGeneratorInterface::ABSOLUTE_URL);
+                                                                       $this->config[$tag][$view]['context']['self_url'] = $this->router->generate($name, ['_locale' => $locale]+$route);
                                                                } else {
                                                                        //Set locale locales context
                                                                        $this->config[$tag][$view]['context']['alternates'][$locale] = [
                                                                                'absolute' => $this->router->generate($name, ['_locale' => $locale]+$route, UrlGeneratorInterface::ABSOLUTE_URL),
                                                                                'relative' => $this->router->generate($name, ['_locale' => $locale]+$route),
                                                                                'title' => implode('/', $titles),
-                                                                               'translated' => $this->translator->trans($this->config['languages'][$locale], [], null, $locale)
+                                                                               'translated' => $this->translator->trans($this->config['default']['languages'][$locale], [], $this->alias, $locale)
                                                                        ];
                                                                }
 
@@ -237,7 +262,7 @@ abstract class AbstractController extends BaseAbstractController implements Serv
                                                                                'absolute' => $this->router->generate($name, ['_locale' => $locale]+$route, UrlGeneratorInterface::ABSOLUTE_URL),
                                                                                'relative' => $this->router->generate($name, ['_locale' => $locale]+$route),
                                                                                'title' => implode('/', $titles),
-                                                                               'translated' => $this->translator->trans($this->config['languages'][$locale], [], null, $locale)
+                                                                               'translated' => $this->translator->trans($this->config['default']['languages'][$locale], [], $this->alias, $locale)
                                                                        ];
                                                                }
                                                        }
@@ -248,6 +273,41 @@ abstract class AbstractController extends BaseAbstractController implements Serv
                }
        }
 
+       /**
+        * {@inheritdoc}
+        *
+        * Renders a view
+        */
+       protected function render(string $view, array $parameters = [], Response $response = null): Response {
+               //Create response when null
+               $response ??= new Response();
+
+               //With empty head locale
+               if (empty($parameters['locale'])) {
+                       //Set head locale
+                       $parameters['locale'] = $this->locale;
+               }
+
+               //Call twig render method
+               $content = $this->twig->render($view, $parameters);
+
+               //Invalidate OK response on invalid form
+               if (200 === $response->getStatusCode()) {
+                       foreach ($parameters as $v) {
+                               if ($v instanceof FormInterface && $v->isSubmitted() && !$v->isValid()) {
+                                       $response->setStatusCode(422);
+                                       break;
+                               }
+                       }
+               }
+
+               //Store content in response
+               $response->setContent($content);
+
+               //Return response
+               return $response;
+       }
+
        /**
         * {@inheritdoc}
         *
@@ -256,10 +316,21 @@ abstract class AbstractController extends BaseAbstractController implements Serv
        public static function getSubscribedServices(): array {
                //Return subscribed services
                return [
+                       'doctrine' => ManagerRegistry::class,
+                       'doctrine.orm.default_entity_manager' => EntityManagerInterface::class,
+                       'form.factory' => FormFactoryInterface::class,
                        'logger' => LoggerInterface::class,
+                       'mailer.mailer' => MailerInterface::class,
+                       'rapsys_pack.slugger_util' => SluggerUtil::class,
                        'request_stack' => RequestStack::class,
                        'router' => RouterInterface::class,
-                       'translator' => TranslatorInterface::class
+                       'security.authorization_checker' => AuthorizationCheckerInterface::class,
+                       'security.helper' => Security::class,
+                       'security.user_password_hasher' => UserPasswordHasherInterface::class,
+                       'service_container' => ContainerInterface::class,
+                       'translator' => TranslatorInterface::class,
+                       'twig' => Environment::class,
+                       'user.cache' => CacheInterface::class
                ];
        }
 }