SensioFrameworkExtraBundle icon indicating copy to clipboard operation
SensioFrameworkExtraBundle copied to clipboard

[RFC] @Redirect annotation

Open vudaltsov opened this issue 7 years ago • 3 comments

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].

vudaltsov avatar May 09 '18 22:05 vudaltsov

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;
    }
}

vudaltsov avatar May 09 '18 22:05 vudaltsov

+1

danaki avatar Jul 12 '19 18:07 danaki

Workaround: https://gist.github.com/danaki/f74320a234c8fdcfffa55970e37da070

danaki avatar Jul 12 '19 19:07 danaki