我想将一个请求转发给某个特定操作的控制器,而不会重定向到另一个网址。
所以,例如,以下网址:
的 /家庭/彼得
内部应该成为中国
/家庭/人/彼得
我知道我可以在'init'函数中捕获动作名称('peter'),然后执行Controller :: redirect,但我想保留在同一个url上,只需将请求内部转发到“人民”行动。
有两点需要注意:
我已经在Controller类中找到了'handleAction'和'handleRequest'方法,但是无法想象如何将它们用于我的任务。
SilverStripe版本:3.0.3
答案 0 :(得分:3)
我建议使用static $url_handlers
描述here,它允许您定义特定的行动路线。您的用例可以通过使用catch-all url-handler来实现。
但因此我们必须注意每条路线的顺序。必须在最后定义全能路线。所有其他操作都需要一个单独的url处理程序:
public static $url_handlers = array(
'otherAction' => 'otherAction',
// ...
'people/$Name' => 'people',
'$Name' => 'people' // catch-all
);
这应该适合您的解释。最后一条路线捕获之前未处理的所有动态路线。
但正如Ingo所提到的,两条路线都会提供相同的内容,这可能对SEO不利。您可以将第二条路线people/$Name
定位到另一个操作,该操作仅使用$Name
将301重定向到网址。如果您已经拥有公开内容并且想要用短版本替换现有URL,我建议您这样做。
我希望这能解决你的问题(暂时)。
答案 1 :(得分:1)
首先,我假设您有充分的理由制作重复的网址(对搜索引擎优化不利):)
我已经尝试了Director::direct()
,这将是最干净的,但没有得到任何结果。 Director::test()
重置大多数请求状态,因此也不符合条件。
在新的控制器实例上调用handleRequest()
或handleAction()
很棘手,因为Director
已经构建了很多状态(例如推送到控制器堆栈)。
所以,不幸的是SilverStripe路由并不灵活,你所做的任何事情都会深入到系统内部,并可能会破坏下一个版本。