在ModelAsController子类上调用一个动作

时间:2016-12-15 01:23:41

标签: php controller routes silverstripe

我的routes.yml中有自定义路线,可将任何未知请求转发至BaseController

'$URLSegment/$Name/$Action/$ID': 'BaseController'

从那里,请求被路由(在其他地方)到我的主控制器,由控制器的index()处理。

但是它始终会使用index(),所以如果我转到网址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()调用该函数并返回这样的模板但是我相当确定这会绕过我希望维护的允许操作的安全功能。

我已在$allowed_actions中定义了MainController并添加了:

private static $url_handlers = array(
    '$URLSegment/$Name/something/$ID' => 'something'
);

但它仍然只是调用index()

如何通过自定义路由MainController

维护SilverStripe的相同操作路由

2 个答案:

答案 0 :(得分:2)

您还需要定义display: inline private static $allowed_actions,后者提供自定义路由。

基本上所有的东西来自:https://docs.silverstripe.org/en/3/developer_guides/controllers/routing/

答案 1 :(得分:0)

这还没有很好的文档,但是如果你想将/ path / $ Action / $ Name / $ ID的URL约定转换为类似/ path / $ Name / $ Action的那么你就放了:

private static $url_handlers = array(
    'path//$Name/$Action' => 'handleAction'
);

handleAction is important as it calls the parents ( Controller`)handleAction并正确地应用权限等等。