我在使用Symfony RewritingUrl时遇到了一些麻烦(2.8)
我的目标是重定向某些URL,而不必在浏览器栏中更改它们.
我需要这个,所以URL可能有一个自定义的,人类可读的形式,并且可以共享.
URL也用在表单中,因此数据以?param = data形式发送
Homewever,Symfony的内部路由似乎不太适合它(或者我可能忽略了一些东西,但我整天都在寻找这个,而没有找到正确的答案)
没有框架,在.htaccess中
如果用户去了
www.website.com/search/London/15
我会将它们重定向到
www.website.com/searchEngine?search_action[city]=London&search_action[radius]=15
在不改变浏览器URL的情况下,使用简单的RewriteRule显示searchEngine nevers
RewriteRule ^search/(.*)/(.*)$/searchEngine?search_action[city]=$1&search_action[radius]=$2 [L]
但是,一旦我尝试与Symfony使用相同的规则(在/ web forlder中的.htaccess,对吧?),
www.website.com/search/London/15登陆Symfony 404错误页面
我的猜测是Symfony试图查找内部/搜索路由,这个路径不存在,因为URL旨在通过.htaccess静默重定向到SearchEngin
SearchEngine路线确实存在且www.website.com/SearchEngine?search_action[city]=London\u0026amp;search_action[radius]=15工作得很好
到目前为止,如果我将R标志添加到RewriteRule中,.htaccess和Symfony一起工作
RewriteRule ^search/(.*)/(.*)$/searchEngine?search_action[city]=$1&search_action[radius]=$2 [R,L]
但那是因为当URL被重定向到SearchEngine时,URL会在浏览器中发生变化.
有没有办法让Symfony知道/ search / London / 15会导致SearchEngine?search_action [city] = London& search_action [radius] = 15,并且在没有Url更改的情况下工作?
任何人都知道我应该为此调整什么?
路由
非常基本的,单一路由只是为了这个URL可读功能和搜索,没有什么太花哨.
使用routing.yml
research_action:
path: /SearchEngine
defaults: { _controller: "MySearchBundle:Search:search" }
SearchController:searchAction
public function searchAction(Request $request)
{
/*
expect search_action[city]=London and search_action[radius]=15
*/
$form = $this->createForm('MySearchBundle\Form\Type\SearchType',null);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid())
{
//Get here without problem when from SearchEngine?search_action[city]=London&search_action[radius]=15
/*
This is where Zhuli do the thing
*/
}
return $this->render('SomeDefaultPage.html.twig');
}
的.htaccess
...
//Basic Symfony Routing stuff
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]
#Doesn't work without that R tag
RewriteRule search/(.*)/(.*)$/SearchEngine?search_action[city]=$1&search_action[radius]=$2 [R=301,L]
# Rewrite all other queries to the front controller.
RewriteRule .? %{ENV:BASE}/app.php [L]
.....
最佳答案 所以我发现了一些东西
这比.htaccess中的规则要长得多,但我找不到另一种解决方法.
我创建了一个新的Route,它将/ search / London / 15查询转发给SearchEngine
forward_action:
path: /search/{city}/{radius}
defaults: { _controller: "MySearchBundle:Search:searchForward" }
调节器
在Controller Action中,我检索传递给Request:ParameterBag的URL属性(城市和半径);然后我转发到SearchEngineAction
public function searchForwardAction(Request $request,$city,$radius)
{
//Putting the attribute in an array
$query['city']=$city;
$query['radius']=$radius;
/*
Which I pass to the request as a parameter
The forward will treat this like a Get Query
?search_action[city]=$city&search_action[radius]=$radius
*/
$request->query->set('search_action',$query);
//Forwarding !
return $this->forward('MySearchBundle:Search:search', array('request' => $request));
}
由于我使用forward(),浏览器上的URL保持为/ Search / Kyoto / 25
但是返回/ SearchEngine的结果?search_action [city] = Kyoto& search_action [radius] = 25
它运行得很好,但是如果将它与通常在.htaccess中的单个规则(仍然无法正常工作)进行比较,那么只有这个URL重写的代码和工作量会变得非常繁重
我将不得不修改搜索表单所指向的位置
我怀疑它是最好的解决方案,因为它非常复杂,只是为了这么简单的任务.
谁变得更好?