我想在我的网站中实现一些自定义路由,最终将成为数据库查找以定义返回的内容。我一直在关注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/
和其他预定义路由无效。
答案 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"));
}
}