0

每次在 CodeIgniter 中加载页面时,我都想实例化一个类。

看起来 /application/config/autoload.php 是执行此操作的地方。那是对的吗?

我将此行添加到包的自动加载中:

$autoload['packages'] = array('/application/third_party/Autoload.php');

现在我需要在每个页面上执行这段代码,我在哪里可以做到这一点?

$bugsnag = new Bugsnag_Client("YOUR-API-KEY-HERE");
set_error_handler(array($bugsnag, "errorHandler"));
set_exception_handler(array($bugsnag, "exceptionHandler"));
4

4 回答 4

3

要自动加载包(根据CI),您应该将以下数组放入package path/name以下数组,例如

$autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');

但它不会自动执行任何代码,而是让您的包无需显式加载即可使用。

要使某些代码每次都执行,您可以将该代码放入基本控制器的constructor函数中。此外,您可以将代码放入config.php文件中。如果您有扩展的基本控制器,例如application/core/MY_Controller.php

class MY_Controller extends CI_Controller {
    //
}

然后你可以使用它的构造函数

class MY_Controller extends CI_Controller {
    function __construct()
{
    parent::__construct();
    $this->bugsnag = new Bugsnag_Client("YOUR-API-KEY-HERE");
            set_error_handler(array($bugsnag, "errorHandler"));
            set_exception_handler(array($bugsnag, "exceptionHandler"));
}
}

您的其他控制器将使用/扩展MY_Controller而不是CI_Controller.

但是您也可以hook在这种情况下使用 a (注册自定义异常处理程序),在application/config/hooks.php文件中,放入以下代码

$hook['pre_controller'][] = array(
    'class'    => 'CustomExceptionHook',
    'function' => 'SetExceptionHandlers',
    'filename' => 'CustomExceptionHook.php',
    'filepath' => 'hooks'
);

application/hooks/CustomExceptionHook.php在文件夹中创建一个类,例如

class CustomExceptionHook
{
    public function SetExceptionHandlers()
    {
        // add package path (if not auto-loaded)
        $this->load->add_package_path(APPPATH.'third_party/package_folder/');
        // load package (if not auto-loaded)
        $this->load->library('Bugsnag_Client');

        set_error_handler(array($this->Bugsnag_Client, "errorHandler"));
        set_exception_handler(array($this->Bugsnag_Client, "exceptionHandler"));
    }
}
于 2013-10-28T06:51:08.423 回答
1

好吧,让我解释一下你是如何做到的。
由于您已经自动加载了包,现在您需要执行此操作。
在 application/core/ 目录中创建一个 MY_Controller。

Class MY_Controller Extends CI_Controller{

    public $bugsnag =   '';
    public function __construct(){

    parent::__construct();
        $this->bugsnag = new Bugsnag_Client("YOUR-API-KEY-HERE");
        set_error_handler(array($bugsnag, "errorHandler"));
        set_exception_handler(array($bugsnag, "exceptionHandler"));     
    }
}

Note$this->bugsnag现在包含该对象。当您需要在任何页面中访问它时,您可以通过扩展父类来简单地做到这一点

Class Test Extends MY_Controller{

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

    public function index(){
        echo '<pre>';
        print_R($this->bugsnag);
    }
}
于 2013-10-28T06:47:33.873 回答
1

这是 MY_Controller.php 的一个版本 这是通过 composer install 使用 BugSnag

使用此方法将$this->_bugsnag变量公开给整个 CI 系统

class MY_Controller extends CI_Controller {

    // Application Version
    public $_app_version;

    // Bugsnag
    public $_bugsnag = NULL;

    /**
     * Constructor
     */
    public function __construct() {

        parent::__construct();

        // Dont print errors to screen
        ini_set('display_errors', 0);

        // Load configs
        $this->load->config('appversion');
        $this->load->config('bugsnag');
        $this->_app_version = $this->config->item('app_version');

        // INIT: bugsnag
        // https://docs.bugsnag.com/platforms/php/other/configuration-options/
        $this->_bugsnag = Bugsnag\Client::make( $this->config->item('bugsnagAPIKey') );
        $this->_bugsnag->setErrorReportingLevel( E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED );
        $this->_bugsnag->setNotifyReleaseStages( ['developement', 'testing', 'production'] );
        $this->_bugsnag->setReleaseStage( ENVIRONMENT );
        $this->_bugsnag->setAppType( 'API Server' );
        $this->_bugsnag->setAppVersion( $this->_app_version );
        $this->_bugsnag->setHostname( $_SERVER['HTTP_HOST'] );
        $this->_bugsnag->setProjectRoot( realpath(APPPATH) );
        $this->_bugsnag->setFilters( ['password'] );
        Bugsnag\Handler::register( $this->_bugsnag );

        // Load Helpers

        // Load Libraries

        // Load Languages
    }
}

您现在可以像这样访问 BugSnag 方法。

$this->_bugsnag->leaveBreadcrumb( 'Hello' );
$this->_bugsnag->notifyException( $e );
于 2017-06-02T02:30:55.097 回答
0

创建一个 MY_Controller 并继承你所有的控制器。您可以通过谷歌搜索“MY_Controller”找到更多信息

于 2013-10-28T06:22:26.733 回答