尝试刷新消息并将用户重定向回Symfony 2中的上一页时,我遇到了一个小问题.
我有一个非常简单的CRUD.当新的或编辑时,我想在相应的创建/更新方法中出现问题时闪烁消息:
User --GET--> new
new --POST--> create (fails)
--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)
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)
来自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)
这对我有用:
$this->redirect($request->server->get('HTTP_REFERER'));
Run Code Online (Sandbox Code Playgroud)