作成日:2018-03-05, 更新日:2018-03-14
基本
1.「fuelphp\core\classes\errorhandler.php」を複製→「fuelphp\app\classes\errorhandler.php」
2.「fuelphp\app\classes\errorhandler.php」の修正
3.「fuelphp\app\bootstrap.php」の修正
中身も「class Errorhandler」ではなく「class Error」になっている箇所があるので適宜変更。
※FuelPHP1.8あたりから「errorhandler.php」になったっぽい。
「fuelphp\app\classes\errorhandler.php」の修正
namespaceや継承の設定。
略 //namespace Fuel\Core; // ←コメント 略 // class PhpErrorException class PhpErrorException extends \Fuel\Core\PhpErrorException // ←継承元の指定 略 // class Errorhandler class Errorhandler extends \Fuel\Core\Errorhandler // ←継承元の指定 以下、略
「fuelphp\app\bootstrap.php」の修正
\Autoloader::add_classes(array( // Add classes you want to override here // Example: 'View' => APPPATH.'classes/view.php', 'PhpErrorException' => APPPATH.'classes/errorhandler.php', 'Errorhandler' => APPPATH.'classes/errorhandler.php', ));
各種調整
エラーがあったときは「shutdown_handler()」に入るっぽいので、何か処理を加えるならこの関数を起点に考えるのが良さげ。
もしくは画面出力が「show_php_error()」と「show_production_error()」にあたるので、コチラを起点に考える。
PRODUCTIONのときのエラーが「Oops!」だから変更したい
・「core\views\errors\production.php」をコピペして「app\views\errors\production.php」
「app/classes/errorhandler.php」の「shutdown_handler()」から各エラー処理を行っているっぽいので、ココを元に処理(例えば「DBに保存、メール送信させる」等)を追加などすれば良さげ。
PRODUCTIONのときのエラー時にメール送信させたい
・「show_php_error()」を複製して「makeEmailBody()」を作成→内容は「データだけ返す」って感じ。
・「show_production_error()」の中で「$is_cli」じゃないときにメール送信させるようにする。
▼「fuelphp\app\classes\errorhandler.php」:下記のソースは古いバージョンなのでそのままコピペするのはダメ。
~ 略 ~
public static function makeEmailBody(\Exception $e)
{
$fatal = (bool) ( ! in_array($e->getCode(), \Config::get('errors.continue_on', array())));
$data = static::prepare_exception($e, $fatal);
if ($fatal)
{
$data['contents'] = ob_get_contents();
while (ob_get_level() > 0)
{
ob_end_clean();
}
ob_start(\Config::get('ob_callback', null));
}
else
{
static::$non_fatal_cache[] = $data;
}
//if (\Fuel::$is_cli)
//{
// \Cli::write(\Cli::color($data['severity'].' - '.$data['message'].' in '.\Fuel::clean_path($data['filepath']).' on line '.$data['error_line'], 'red'));
// if (\Config::get('cli_backtrace'))
// {
// \Cli::write('Stack trace:');
// \Cli::write(\Debug::backtrace($e->getTrace()));
// }
// return;
//}
if ($fatal)
{
if ( ! headers_sent())
{
$protocol = \Input::server('SERVER_PROTOCOL') ? \Input::server('SERVER_PROTOCOL') : 'HTTP/1.1';
// header($protocol.' 500 Internal Server Error');
$data['protocol'] = $protocol.' 500 Internal Server Error';
}
$data['non_fatal'] = static::$non_fatal_cache;
//try
//{
// exit(\View::forge('errors'.DS.'php_fatal_error', $data, false));
//}
//catch (\FuelException $view_exception)
//{
// exit($data['severity'].' - '.$data['message'].' in '.\Fuel::clean_path($data['filepath']).' on line '.$data['error_line']);
//}
}
return $data;
//try
//{
// echo \View::forge('errors'.DS.'php_error', $data, false);
//}
//catch (\FuelException $e)
//{
// echo $e->getMessage().'<br />';
//}
}
/**
* Shows the errors/production view and exits. This only gets
* called when an error occurs in production mode.
*
* @return void
*/
public static function show_production_error(\Exception $e)
{
// when we're on CLI, always show the php error
if (\Fuel::$is_cli)
{
return static::show_php_error($e);
}
// send-mail
$emailData = self::makeEmailBody($e);
→この「$emailData」をメール本文にセットして送信。配列だから文字列に変換してあげるか何かする。
if ( ! headers_sent())
~ 以下、略 ~
※このソースは古いバージョンで使ったソース。「public static」→「protected static」などと微妙に違う。