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;
-
- ///ContainerInterface instance
- protected $container;
-
- ///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 = [];
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);
}
//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
}
//Translate tmp value
- $tmp = $this->translator->trans($tmp);
+ $tmp = $this->translator->trans($tmp, [], $this->alias);
//Iterate on keys
foreach(array_reverse($keys) as $curkey) {
$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
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)
];
}
'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)
];
}
}
}
}
+ /**
+ * {@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}
*
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
];
}
}