I have an application with slug. All routes will start with the same url. URL looks like myapp.com/company_slug/locale/.....
After I have submitted the login form, i have an error in my GuardAuthenticator to getLoginUrl(). Some mandatory parameters are missing ("company_slug") to generate a URL for route "app_login".
How i can have a company_slug in all route of my application and how to fix this bug ?
<?php
namespace App\Security;
[.....]
/**
* Class LoginFormAuthenticator
*/
class LoginFormAuthenticator extends AbstractFormLoginAuthenticator
{
use TargetPathTrait;
private $entityManager;
private $urlGenerator;
private $csrfTokenManager;
private $passwordEncoder;
public function __construct(EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder)
{
$this->entityManager = $entityManager;
$this->urlGenerator = $urlGenerator;
$this->csrfTokenManager = $csrfTokenManager;
$this->passwordEncoder = $passwordEncoder;
}
[....]
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
return new RedirectResponse($targetPath);
}
$url = $this->urlGenerator->generate('index');
return new RedirectResponse($url);
}
protected function getLoginUrl()
{
return $this->urlGenerator->generate('app_login');
}
}
Controller where i would like to redirect to route "index" (/{company_slug}/{_locale}/index).
<?php
namespace App\Controller;
use App\Entity\Candidate;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Class DefaultController.
*
* @Route("/{company_slug}/{_locale}")
*/
class DefaultController extends AbstractController
{
/**
* @Route("/", name="index")
*/
public function index()
{
if ($this->getUser() instanceof User) {
return $this->redirectToRoute('admin_index');
} elseif ($this->getUser() instanceof Candidate) {
return $this->redirectToRoute('candidate_index');
} else {
return $this->redirectToRoute('app_login');
}
}
}
Just in case, i setted an company attribute on kernel event.
<?php
namespace App\EventSubscriber;
use App\ContextStorage;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
/**
* Class AgencyContextSubscriber.
*/
class CompanyContextSubscriber implements EventSubscriberInterface
{
/**
* @var ContextStorage
*/
private $contextStorage;
public function __construct(ContextStorage $contextStorage)
{
$this->contextStorage = $contextStorage;
}
public function onKernelRequest(RequestEvent $event)
{
if (!$event->isMasterRequest()) {
return;
}
$companySlug = $event->getRequest()->get('company_slug');
if (!$companySlug) {
return;
}
$company = $this->contextStorage->activateContextBySlug($companySlug);
$event->getRequest()->attributes->set('company', $company);
}
public static function getSubscribedEvents()
{
return [
'kernel.request' => 'onKernelRequest',
];
}
}