【问题标题】:Custom routing without overriding core CMS routing自定义路由,不覆盖核心 CMS 路由
【发布时间】:2016-10-26 03:14:01
【问题描述】:

我想在我的站点中实现一些自定义路由,最终将作为数据库查找来定义返回的内容。我一直在查看this example,它没有按预期工作(主要是因为它用于 SS2)。

我有我的主要路线.yml:

---
Name: mysiteroutes
After:
  - 'framework/routes#coreroutes'
---
Director:
  rules:
    'create//$Action': 'CreateController'
    'profile//$Person/$Action/': 'ProfileController'

我的_config.php:

Director::addRules(2, array(
    '$URLSegment//$Action/$Detail/$Option' => 'BaseController',
));

我的基础控制器:

class BaseController extends ModelAsController {

    public function getNestedController() {
        if ($this->getRequest()->params('URLSegment') =='Test') {
            return new ProfileController();
        } else {
            return parent::getNestedController($this->getRequest()->params('URLSegment'));
        }
    }
}

我的个人资料控制器:

class ProfileController extends Controller {

    private static $allowed_actions = array(
        'test'
    );

    public function index(SS_HTTPRequest $request) {
        return $this->renderWith(array("ProfileHomePage", "Page"));
    }

    public function test(SS_HTTPRequest $request) {
        print_r($request->params());
        return $this->renderWith(array("ProfileHomePage", "Page"));
    }
}

这在没有动态路由的情况下可以正常工作,但是我想在(例如)/example/ 下捕获任何东西,检查是否有它的数据库条目(通过我尚未编写的自定义脚本),如果没有通过 cms 路由它(即检查是否有预定义的路由,然后在返回 404 之前是否有页面)。我怎样才能做到这一点?

我确实尝试了'$URLSegment//$Action/$Detail/$Option': 'ProfileController',我可以正确路由并加载自定义模板等,但这意味着/admin//create/ 和其他预定义路由不起作用。

【问题讨论】:

  • 也许你想要__magic方法?
  • 更多的是与路由有关,而不是覆盖核心功能,不确定 __magic 方法如何帮助纠正这个问题?
  • 您需要动态路由。您可以将 url 段或 uri 部分或完整请求传递给 __get() 方法,以对您的任何(前/后/部分)路由进行自定义调用。在这里你可以有单独的配置。
  • 据我了解,这适用于调用函数,但我的配置仍会覆盖 SilverStripe 设置的预定义配置,这更是我面临的问题。

标签: php routing silverstripe


【解决方案1】:

这是一种方法,尽管可能有更好的方法:

---
Name: mysiteroutes
---
Director:
  rules:
    'create//$Action': 'CreateController'
    'profile//$Person/$Action': 'ProfileController'
---
Name: modelascontrollerroutes
After: '#rootroutes'
---
Director:
  rules:
    '': 'HomePage_Controller'
    '$URLSegment//$ID': 'BaseController'

基础控制器:

class BaseController extends ModelAsController {

    public function getNestedController() {
        $params = $this->getRequest()->params();
        if (/*check for $params['URLSegment'] here */) {
            //return custom controller
        } else {
            return parent::getNestedController();
        }
    }
}

自定义控制器示例:

class PersonController extends Controller {

    private static $allowed_actions = array(
    );

    public function index(SS_HTTPRequest $request) {
        return $this->renderWith(array("PersonHomePage", "Page"));
    }
}

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2018-04-22
    相关资源
    最近更新 更多