SensioFrameworkExtraBundle
SensioFrameworkExtraBundle copied to clipboard
[RFC] @Redirect annotation
Hi!
I suggest creating a new annotation for redirecting on some condition. Inspired by @iltar's comment if I got him right.
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Redirect;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class AuthController
{
/**
* @Route("/login")
* @Redirect("is_granted('IS_AUTHENTICATED_REMEMBERED')", target=['route', {param: 'value'}], statusCode=302)
*/
public function loginAction()
{
}
}
The condition argument (first) is an expression with access to current request object and security functions. The target argument is either a url string or an array [route, params].
Here's how the listener might look like
public function onKernelController(FilterControllerEvent $event): void
{
$request = $event->getRequest();
$redirects = $request->attributes->get('_redirect', []);
foreach ($redirects as $redirect) {
if (!$redirect instanceof Redirect) {
continue;
}
$condition = $this->conditionLanguage->evaluate($redirect->getCondition(), $this->resolveConditionVars($request));
if (!$condition) {
continue;
}
$response = new RedirectResponse($this->resolveTarget($redirect->getTarget()), $redirect->getStatusCode());
$event->setController(function () use ($response) {
return $response;
});
$event->stopPropagation();
return;
}
}
+1
Workaround: https://gist.github.com/danaki/f74320a234c8fdcfffa55970e37da070