转发请求到控制器动作

时间:2012-11-28 16:58:44

标签: silverstripe

我想将一个请求转发给某个特定操作的控制器,而不会重定向到另一个网址。

所以,例如,以下网址:
/家庭/彼得
内部应该成为中国 /家庭/人/彼得

我知道我可以在'init'函数中捕获动作名称('peter'),然后执行Controller :: redirect,但我想保留在同一个url上,只需将请求内部转发到“人民”行动。

有两点需要注意:

  • 'peter'是一个动态字符串,所以我不能只为这个
  • 编写路线
  • 控制器的任何其他动作仍然有效,因此只有几个字符串应该被识别(例如'peter','ann'转发到'people'动作,而'otherAction'仍然可以调用)< / LI>

我已经在Controller类中找到了'handleAction'和'handleRequest'方法,但是无法想象如何将它们用于我的任务。

SilverStripe版本:3.0.3

2 个答案:

答案 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路由并不灵活,你所做的任何事情都会深入到系统内部,并可能会破坏下一个版本。