我第一次使用没有CMS模块的框架。当我通过未由控制器/操作处理的URL访问应用程序时,我只获得一个包含文本的页面"没有匹配URL规则"。这导致Director :: handleRequest()没有将任何控制器与url段匹配......或者" Action' ABC'在XYZController课程中不可用。"
我想将任何未经匹配的请求发送到相当于一个不错的404页面的控制器。这样做的正确或最佳方式是什么?
答案 0 :(得分:2)
错误模板仅包含在CMS中。框架只返回带有纯文本消息的HTTP响应代码。
我刚刚开始使用我自己的框架项目,这是我的解决方案:
[routes.yml]
---
Name: rootroutes
---
Director:
rules:
'': 'MyController'
'$URLSegment': 'MyController'
[myController的]
class MyController extends Controller {
private static $url_handlers = array(
'$URLSegment' => 'handleAction',
);
public function index() {
return $this->httpError(404, "Not Found");
}
/**
* Creates custom error pages. This will look for a template with the
* name ErrorPage_$code (ie ErrorPage_404) or fall back to "ErrorPage".
*
* @param $code int
* @param $message string
*
* @return SS_HTTPResponse
**/
public function httpError($code, $message = null) {
// Check for theme with related error code template.
if(SSViewer::hasTemplate("ErrorPage_" . $code)) {
$this->template = "ErrorPage_" . $code;
} else if(SSViewer::hasTemplate("ErrorPage")) {
$this->template = "ErrorPage";
}
if($this->template) {
$this->response->setBody($this->render(array(
"Code" => $code,
"Message" => $message,
)));
$message =& $this->response;
}
return parent::httpError($code, $message);
}
}
[ErrorPage.ss]
<h1>$Code</h1>
<p>$Message</p>
您还可以使用ErrorPage_404.ss,ErrorPage_500.ss等创建更具体的错误模板。
答案 1 :(得分:0)
如前所述,如果不更新路由,那么我最近正在处理的模块将允许正则表达式重定向映射,挂钩到未找到的页面(404)。这被设计为在有或没有CMS的情况下起作用:)
https://github.com/nglasl/silverstripe-misdirection
它基本上使用请求过滤器来处理当前请求/响应,适当地指导您进行任何可能已定义的映射。