在 ModelAsController 子类上调用一个动作

Calling an action on ModelAsController subclass

我的 routes.yml 中有一个自定义路由,可以将任何未知请求转发到 BaseController

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

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

但是它将始终使用 index() 所以如果我转到 URL test1/test2/action/5 它仍然是 运行 by 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() 和 return 模板中调用该函数,但是我很确定这会绕过我很想执行的允许操作的安全功能维持。

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

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

但它仍然只是调用 index()

如何通过自定义路由保持 SilverStripe 的相同动作路由 MainController

您需要定义 private static $allowed_actions,也许还需要定义 private static $url_handlers,后者提供自定义路由。

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

这没有很好的记录,但如果您想将 /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 并正确路由应用权限等。