【发布时间】: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