设想:
- 我没有 AJAX。
- 我有一个带有
GET
method 和csrf_protection
disabled 的搜索表单,用于过滤显示和分页的实体myEntityListAction
,可通过 uri 访问/myapp/myentity/list
- 用户打开
/myapp/myentity/list
,提交过滤表单并转到第 2 页。他现在在/myapp/myentity/list?entity_filter[search]=something&page=2
- 用户打开另一个页面(假设显示的实体之一的详细信息),然后单击
/myapp/myentity/list
我想让他看到页面/myapp/myentity//list?entity_filter[search]=something&page=2
我试图使过滤器粘到用户的会话中,这样当用户在/myapp/myentity/list
没有任何参数的情况下重新打开时,他会得到最后一次看到的结果,具有相同的过滤器和页码。
我遵循了这种方法,但我认为它已被高度弃用,因为我正在修改$request
对象和$_GET
超全局(由于直接使用 $_GET 的分页库),尽管它有效。
/**
* @Route("/myapp/myentity/list", name="entity_list")
* @Method({"GET"})
*/
public function myEntityListAction(Request $request) {
if (0===$request->query->count()) { //querystring is empty
$prev_query=$request->getSession()->get('my_entity_list', null);
if ($prev_query) { //is there something in session?
$_GET=$prev_query;
$original_request=$request;
$request=$request->createFromGlobals();
$request->setSession($original_request->getSession());
}
} else { //i have something in my querystring
$request->getSession()->set('my_entity_list', $request->query->all()); //i store it in session
}
//...do the other stuff (form, filters, pagination, etc)
}
我认为我将采用另一种方法,将用户重定向到/myapp/myentity/list?entity_filter[search]=something&page=2
(从会话中读取),这样我就不必修改$_GET
或$request
.
问题来了:如何在不进行重定向的情况下安全地编辑 $request 以注入或更改我需要的东西?我可以通过子请求安全地做到这一点吗?