【发布时间】:2017-04-30 12:15:56
【问题描述】:
我的routes.yml 中有一个自定义路由,它将任何未知请求转发到BaseController
'$URLSegment/$Name/$Action/$ID': 'BaseController'
然后,请求从那里(在其他地方)路由到我的主控制器,由控制器的index() 处理。
但是,它总是使用index(),所以如果我转到 URL test1/test2/action/5,它仍将由index() 运行
这是我的BaseController
class BaseController extends ModelAsController {
public function getNestedController() {
$action
$params = $this->getRequest()->params();
$this->loadMain($params['URLSegment'], $params['Name'], $params['Action'], $params['ID']);
}
private function loadMain($first, $name, $action, $id) {
$main = new MainController();
$main->{$action}();
}
}
这将调用该函数,但是index() 函数已经运行并设置了模板。
我知道我可以从 index() 调用该函数并像这样返回模板,但是我很确定这会绕过我热衷于维护的允许操作的安全功能。
我在MainController 中定义了$allowed_actions 并添加了:
private static $url_handlers = array(
'$URLSegment/$Name/something/$ID' => 'something'
);
但它仍然只是调用index()。
如何通过自定义路由MainController保持SilverStripe相同的动作路由
【问题讨论】:
-
您是否刷新以使配置更改生效?
-
@wmk 是的,我做到了。
-
您正在通过
$main->foo()调用方法(例如)。通过这样做,您将始终调用foo,url_handlers不会改变这一点。我真的不明白使用BaseController的意义,你为什么不在路由中使用MainController? -
@FatalError 在此之前我做的一些事情是从数据库中提取额外的详细信息以显示在主控制器中。这对这个问题并不重要。
标签: php controller routes silverstripe