X-Git-Url: https://git.rapsys.eu/userbundle/blobdiff_plain/e76a1923e813fdf1fd24115ad0f976d2df58cc6f..HEAD:/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 ]; } }