仅限SilverStripe框架 - 如何处理404

时间:2014-09-15 23:55:53

标签: silverstripe

我第一次使用没有CMS模块的框架。当我通过未由控制器/操作处理的URL访问应用程序时,我只获得一个包含文本的页面"没有匹配URL规则"。这导致Director :: handleRequest()没有将任何控制器与url段匹配......或者" Action' ABC'在XYZController课程中不可用。"

我想将任何未经匹配的请求发送到相当于一个不错的404页面的控制器。这样做的正确或最佳方式是什么?

2 个答案:

答案 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

它基本上使用请求过滤器来处理当前请求/响应,适当地指导您进行任何可能已定义的映射。