【问题标题】:Extend Codeigniter Exceptions class to add a custom method扩展 Codeigniter Exceptions 类以添加自定义方法
【发布时间】:2023-03-24 05:50:01
【问题描述】:

我创建了一个新方法来处理 401 apache 错误。

我的核心类扩展了 CI 核心类,但是当我调用方法名称时,我收到以下消息:

致命错误:在第 29 行
G:\Path\application\controllers\loader.php 中调用未定义函数 show_401()

class MI_Exceptions extends CI_Exceptions {

    function __construct()
    {
        parent::__construct();
    }

    /**
     * 401 Unauthorized
     *
     * @access  private
     * @param   string  the page
     * @param   bool    log error yes/no
     * @return  string
     */
    function show_401($page = '', $log_error = TRUE)
    {
        $heading = "401 Unauthorized";
        $message = "Unauthorized.";

        // By default we log this, but allow a dev to skip it
        if ($log_error)
        {
            log_message('error', '401 Unauthorized --> '.$page);
        }

        echo $this->show_error($heading, $message, 'error_401', 401);
        exit;
    }
}

【问题讨论】:

  • 你试过public function show_401(吗?
  • 是的!这也行不通。核心是由 CodeIgniter 自动加载的,对吗?或者我需要加载核心,就像我加载一个库一样?
  • @user3108967 同时发布controllers/loader.php(控制器)文件。
  • @Hashem Qolami 只需调用 show_401();

标签: php codeigniter codeigniter-2


【解决方案1】:

您已正确扩展了 Exceptions 核心类。

只需确保您已将 subclass_prefix 配置设置如下:

$config['subclass_prefix'] = 'MI_';

不过,您似乎直接在 Controller 中使用了 show_401() 函数。

关键是您不能全局范围中将类方法作为函数访问。
换句话说,您必须创建类的实例才能访问show_401() 方法。

但是show_404() 内置函数是如何工作的呢?

这是因为 CodeIgniter 为该方法创建了 a Common function,帮助用户在全局范围内使用 Exception::show_404() 方法。

system/core/Common.php

function show_404($page = '', $log_error = TRUE)
{
    $_error =& load_class('Exceptions', 'core');
    $_error->show_404($page, $log_error);
    exit;
}

该函数使用另一个名为 load_class() 的常用函数来获取 Exceptions 核心类 (returning by reference) 的实例,以便访问 show_404() 方法。

通用函数与辅助函数相同,但they're loaded at very beginning of the application

show_401() 函数工作

为了在全局范围内使用此函数,您可以创建一个辅助函数来创建该类的实例,并访问您的自定义方法。

CodeIgniter 中没有 Exceptions 内置帮助文件。因此,您可以在 application/helpers/ 文件夹中创建 exceptions_helper.php 文件来添加您的辅助函数:

application/helpers/exceptions_helper.php

if ( ! function_exists('show_401'))
{
    function show_401($page = '', $log_error = TRUE)
    {
        $_error =& load_class('Exceptions', 'core');
        $_error->show_401($page, $log_error);
        exit;
    }
}

最后,在控制器中加载帮助文件:

$this->load->helper('exceptions');

// Then use the function
show_401();

您还可以通过将帮助程序名称添加到 autoload.php 配置文件中来自动加载帮助程序文件(如果需要始终加载):

$autoload['helper'] = array('exceptions'/*, 'language', 'form'*/);

【讨论】:

  • 我可以扩展通用核心吗?
  • @user3108967 Common.php 核心文件不是 Class 并且无法扩展它,因为它是在应用程序的开头加载的。最好的方法是使用我建议的自定义帮助文件:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
相关资源
最近更新 更多