1

在 Kohana 2 中,您可以通过创建自定义 kohana_error_page.php 文件并将其放在您的视图目录中来覆盖默认错误页面。但是,这会覆盖所有错误,而不仅仅是 404 错误。在 500 错误的情况下,我仍然希望获得友好的橙色 kohana 错误页面。

有没有人有这样做的经验?

4

2 回答 2

3

你可以在 KO2 中使用hooks很容易地做到这一点。如果您查看事件,您会发现system.404 需要使用以下内容替换哪些事件:

<?php defined('SYSPATH') or die('No direct script access.');

// Replace the default kohana 404
Event::replace('system.404', array('Kohana', 'show_404'), 
    array('hook_404', 'show'));

class hook_404 {
    public function show()
    {
        // first param is URI of page, second param is template to use
        Kohana::show_404(FALSE, 'custom_404');
    }

}

将其保存在应用文件夹(或模块)的 hooks 目录中。不要忘记在你的配置中启用钩子:

$config['enable_hooks'] = TRUE;

并添加您的自定义 404 视图:views/custom_404.php.

注意:$config['display_errors']如果您已设置为FALSE,这些将不会显示config.php(如果您是 IN_PRODUCTION 可能应该是正确的?)。为此,您需要输出一些东西并死去,例如。替换Kohana::show_404为以下内容:

require Kohana::find_file('views', 'custom_404');
die();
于 2012-04-04T12:50:56.010 回答
2

我没有测试过这个!!因此,在执行此操作之前备份您的代码。

如果我没记错的话,Kohana2 具有硬编码的异常处理,并且没有添加新异常的好方法。要解决这个问题,您必须对核心进行更改。

在文件中system/i18n/en_US/errors.php

  • 添加新条目:

    E_PAGE_ACCESS_DENIED => array( 1, 'Access Denied', ' -- message text-- ')
    

在文件中system/i18n/en_US/core.php

  • 添加新条目:

    'page_access_denied' => 'You are not permitted to access %s .'
    

system/core/Koahana.php

  • 在 Kohana::setup() 方法的顶部附近,添加新常量:

    define('E_PAGE_ACCESS_DENIED', 69);
    
  • 为您的自定义错误注册事件(在同一结尾附近的某处,Kohana::setup()您将看到第 404 个错误的注册):

    Event::add('system.403', array('Kohana', 'show_403'));
    
  • 接下来,找到Kohana::show_404()并创建您自己的方法的位置:

    public static function show_403($page = FALSE, $template = FALSE)
    {
        throw new Kohana_403_Exception($page, $template);
    }
    
  • 向下滚动到文件的底部 .. 在那里你会找到类定义Error_404_Exception... 为 . 制作一个403。不要忘记:

    1. 定义新变量protected $template = 'file_name_for_template';
    2. protected $code = E_PAGE_ACCESS_DENIED;
    3. Exception::__construct(Kohana::lang('core.page_access_denied', $page));
    4. header('HTTP/1.1 403 Forbidden');

    模板文件必须位于system/views/

现在您应该可以从应用程序中的任何位置调用Event::run('system.403');

于 2012-03-22T02:01:51.810 回答