Kohana 2自定义404错误页面

时间:2012-03-21 12:20:46

标签: php http-status-code-404 kohana kohana-2

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

有没有人有这方面的经验?

2 个答案:

答案 0 :(得分:3)

您可以使用hooks轻松地在KO2中执行此操作。如果您查看events,您会找到system.404,您需要使用以下内容替换{<1}}

<?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');
    }

}

将其保存在app文件夹(或模块中)的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();

{{1}}

答案 1 :(得分: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');
    5. 模板文件必须位于 system / views /

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