X-Git-Url: https://git.rapsys.eu/userbundle/blobdiff_plain/e76a1923e813fdf1fd24115ad0f976d2df58cc6f..147361137a871795a8b0293d1c1e7927f9ba3567:/Controller/AbstractController.php

diff --git a/Controller/AbstractController.php b/Controller/AbstractController.php
index cdbbf12..77cf860 100644
--- a/Controller/AbstractController.php
+++ b/Controller/AbstractController.php
@@ -13,114 +13,106 @@ 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\PasswordHasher\Hasher\UserPasswordHasherInterface;
-use Symfony\Contracts\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\PackBundle\Util\SluggerUtil;
-
-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 {
-	///Config array
-	protected $config;
-
-	///Context array
-	protected $context;
-
-	///ManagerRegistry
-	protected $doctrine;
-
-	///UserPasswordHasherInterface
-	protected $hasher;
-
-	///LoggerInterface
-	protected $logger;
-
-	///MailerInterface
-	protected $mailer;
+	/**
+	 * Alias string
+	 */
+	protected string $alias;
 
-	///EntityManagerInterface
-	protected $manager;
+	/**
+	 * Config array
+	 */
+	protected array $config;
 
-	///Router instance
-	protected $router;
+	/**
+	 * Context array
+	 */
+	protected array $context;
 
-	///Slugger util
-	protected $slugger;
+	/**
+	 * Locale string
+	 */
+	protected string $locale;
 
-	///Translator instance
-	protected $translator;
+	/**
+	 * Page integer
+	 */
+	protected int $page;
 
-	///Locale
-	protected $locale;
+	/**
+	 * Request instance
+	 */
+	protected Request $request;
 
 	/**
 	 * 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, ManagerRegistry $doctrine, UserPasswordHasherInterface $hasher, LoggerInterface $logger, MailerInterface $mailer, EntityManagerInterface $manager, RouterInterface $router, SluggerUtil $slugger, RequestStack $stack, TranslatorInterface $translator) {
+	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());
-
-		//Set container
-		$this->container = $container;
-
-		//Set doctrine
-		$this->doctrine = $doctrine;
-
-		//Set hasher
-		$this->hasher = $hasher;
-
-		//Set logger
-		$this->logger = $logger;
-
-		//Set mailer
-		$this->mailer = $mailer;
-
-		//Set manager
-		$this->manager = $manager;
-
-		//Set router
-		$this->router = $router;
+		$this->config = $container->getParameter($this->alias = RapsysUserBundle::getAlias());
 
-		//Set slugger
-		$this->slugger = $slugger;
+		//Get current request
+		$this->request = $stack->getCurrentRequest();
 
-		//Set translator
-		$this->translator = $translator;
+		//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 = [];
@@ -131,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);
 			}
@@ -142,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
@@ -215,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) {
@@ -234,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
@@ -256,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)
 									];
 								}
 
@@ -273,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)
 									];
 								}
 							}
@@ -284,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}
 	 *
@@ -292,16 +316,21 @@ abstract class AbstractController extends BaseAbstractController implements Serv
 	public static function getSubscribedServices(): array {
 		//Return subscribed services
 		return [
-			'service_container' => ContainerInterface::class,
 			'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,
+			'security.authorization_checker' => AuthorizationCheckerInterface::class,
+			'security.helper' => Security::class,
 			'security.user_password_hasher' => UserPasswordHasherInterface::class,
-			'translator' => TranslatorInterface::class
+			'service_container' => ContainerInterface::class,
+			'translator' => TranslatorInterface::class,
+			'twig' => Environment::class,
+			'user.cache' => CacheInterface::class
 		];
 	}
 }