自定义路由而不覆盖核心CMS路由

时间:2016-10-26 03:14:01

标签: php routing silverstripe

我想在我的网站中实现一些自定义路由,最终将成为数据库查找以定义返回的内容。我一直在关注this example这不符合预期的工作(主要是因为它适用于SS2)。

我有我的主要routes.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',
));

我的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'));
        }
    }
}

我的ProfileController:

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/和其他预定义路由无效。

1 个答案:

答案 0 :(得分:0)

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

---
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"));
    }
}