Symfony2:重定向到最后一条路由并闪烁消息?

vin*_*nux 36 php symfony

尝试刷新消息并将用户重定向回Symfony 2中的上一页时,我遇到了一个小问题.

我有一个非常简单的CRUD.当新的或编辑时,我想在相应的创建/更新方法中出现问题时闪烁消息:

  1. User --GET--> new
  2. new --POST--> create (fails)
  3. --REDIRECT--> new (with flash message)

我正在做以下事情:

  $this->container->get('session')->setFlash('error', 'myerror');
  $referer = $this->getRequest()->headers->get('referer');   
  return new RedirectResponse($referer);
Run Code Online (Sandbox Code Playgroud)

但是,它没有重定向到正确的推荐人!即使引用者的值是正确的(例如:),http://localhost/demo/2/edit/它也会重定向到索引.为什么?

Fli*_*lip 36

这是Naitsirch和Santi的替代版本.我意识到一个特性对于这个功能来说是完美的.还有点优化了代码.我倾向于回馈所有参数,包括slug,因为在生成路径时可能需要这些参数.

此代码在PHP 5.4.0及更高版本上运行.当然,您可以将特性用于多个控制器.如果将特征放在单独的文件中,请确保在PSR-0之后将其命名为与特征相同的名称.

<?php
trait Referer {
    private function getRefererParams() {
        $request = $this->getRequest();
        $referer = $request->headers->get('referer');
        $baseUrl = $request->getBaseUrl();
        $lastPath = substr($referer, strpos($referer, $baseUrl) + strlen($baseUrl));
        return $this->get('router')->getMatcher()->match($lastPath);
    }
}

class MyController extends Controller {
    use Referer;

    public function MyAction() {
        $params = $this->getRefererParams();

        return $this->redirect($this->generateUrl(
            $params['_route'],
            [
                'slug' => $params['slug']
            ]
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,我用`$ this-> get('request') - > getSchemeAndHttpHost()来替换`$ request-> getBaseUrl()`因为,"getBaseUrl()"返回一个空字符串.我正在使用symfony 2.5 (10认同)
  • 不是很酷,因为这个特性只适用于Controller.更好的方法是创建具有`request.stack`依赖性的服务.然后,您可以从中获取主请求并在任何上下文中返回referrer. (3认同)

Kis*_* Na 10

对于symfony 3.0,flash消息重定向回到上一页,这可以在控制器中完成.

           $request->getSession()
                ->getFlashBag()
                ->add('notice', 'success');
            $referer = $request->headers->get('referer');
            return $this->redirect($referer);
Run Code Online (Sandbox Code Playgroud)

  • 请注意它可能导致https://www.gracefulsecurity.com/http-header-injection/ (3认同)

San*_*nti 9

来自Naitsirch的消息在下一个网址中提供:https: //github.com/symfony/symfony/issues/2951

似乎是您需要的一个很好的解决方案:

public function getRefererRoute()
{
    $request = $this->getRequest();

    //look for the referer route
    $referer = $request->headers->get('referer');
    $lastPath = substr($referer, strpos($referer, $request->getBaseUrl()));
    $lastPath = str_replace($request->getBaseUrl(), '', $lastPath);

    $matcher = $this->get('router')->getMatcher();
    $parameters = $matcher->match($lastPath);
    $route = $parameters['_route'];

    return $route;
}
Run Code Online (Sandbox Code Playgroud)

然后重定向:

public function yourFunctionAction()
{
    $ruta = $this->getRefererRoute();

    $locale = $request->get('_locale');
    $url = $this->get('router')->generate($ruta, array('_locale' => $locale));

    $this->getRequest()->getSession()->setFlash('notice', "your_message");   

    return $this->redirect($url);
}
Run Code Online (Sandbox Code Playgroud)


Vic*_*iah 7

这对我有用:

$this->redirect($request->server->get('HTTP_REFERER'));
Run Code Online (Sandbox Code Playgroud)

  • HTTP_REFERER可以由Web服务器,代理或Web浏览器更改. (3认同)