在 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 并正确路由应用权限等。
我的 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 并正确路由应用权限等。