【问题标题】:Calling an action on ModelAsController subclass在 ModelAsController 子类上调用操作
【发布时间】: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() 调用方法(例如)。通过这样做,您将始终调用foourl_handlers 不会改变这一点。我真的不明白使用BaseController 的意义,你为什么不在路由中使用MainController
  • @FatalError 在此之前我做的一些事情是从数据库中提取额外的详细信息以显示在主控制器中。这对这个问题并不重要。

标签: php controller routes silverstripe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我已经有了 allowed_actions 并添加了 url_handlers 但这并没有改变任何东西。我已经更详细地更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2016-06-17
    • 2018-03-30
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多