PHP Classes

File: classes/ExceptionHandler.php

Recommend this page to a friend!
  Classes of Joshy Francis   Phpnopea   classes/ExceptionHandler.php   Download  
File: classes/ExceptionHandler.php
Role: Example script
Content type: text/plain
Description: Example script
Class: Phpnopea
Simplified MVC Web application framework
Author: By
Last change:
Date: 12 days ago
Size: 7,620 bytes
 

Contents

Class file image Download
<?php
error_reporting
(E_ALL);
//error_reporting(E_STRICT);
set_error_handler("error_handler");
set_exception_handler("error_handler");
register_shutdown_function("error_handler");
function
replace_file_mtime($file){
       
$base_path=App::$base_path;
    
    if((
$pos=strrpos($file,'_'))!==false && ($pos2=strpos($file,'.blade.php',$pos))!==false){
       
$ext=substr($file,$pos2);
       
$file=substr($file, 0, $pos);
       
$dir=dirname($file);
       
$filename=basename($file);
       
$file=$dir.DIRECTORY_SEPARATOR. str_replace('.',DIRECTORY_SEPARATOR,$filename).$ext;
    }
    if((
$pos=strrpos($file,$base_path))!==false){
           
//$file=str_replace($base_path,'',$file);
           
$file=substr($file,$pos+strlen($base_path));
        if((
$pos=strrpos($file,'\storage'))!==false || ($pos=strrpos($file,'/storage'))!==false){
           
$file='\resources'. substr($file,$pos+8);
        }
    }
    return
$file;
}
function
error_handler($code=null,$message='',$file='',$line=0){
   
   
// Check for unhandled errors (fatal shutdown)
   
$e=null;
   
$trace = debug_backtrace();//DEBUG_BACKTRACE_IGNORE_ARGS
   
if($code===null){//Shutdown
       
$e = error_get_last();
        if(
$e){
           
$e=new ErrorException($e['message'],0,$e['type'],$e['file'],$e['line']);
        }else{
            return;
        }
    }elseif(
is_numeric($code)){//Error
       
$e=new ErrorException($message,0,$code,$file,$line);
    }else{
//Exception
       
$e=$code;
       
$trace = $e->getTrace();
    }
   
   
//ob_clean();
   
while (ob_get_level()){
       
//$out.=ob_get_clean();
       
ob_end_clean();
    }
    
   
    if (!
headers_sent()) {
       
http_response_code(500);
    }
   
   
// Output error page
    //echo $message;
    //var_dump($trace);
           
$public_path=App::$public_path;
           
$class_path= $public_path. '/../classes/' ;
                if(
App::$classes_path){
                   
$class_path=App::$classes_path;
                }
           
$storage_path= $public_path. '/../storage/' ;
       
$base_path=App::$base_path;
               
   
$exception=file_get_contents($class_path.'exception.html');
   
$code=$e->getCode();
   
$message=str_replace($base_path,'',$e->getMessage());
   
$message=str_replace($public_path,'',$message);
   
$pos=strpos($message,'include');
        if(
$pos!==false){
           
$pos=strpos($message,'(',$pos+1);
            if(
$pos!==false){
               
$file=substr($message,$pos+1) ;
               
$pos=strpos($file,')',$pos+1);
               
$file=substr($file,0,$pos-1) ;
               
$file_name=basename($file);
                if((
$pos=strrpos($file_name,'\\'))!==false){
                   
$file_name=substr($file_name, $pos+1) ;
                }elseif((
$pos=strrpos($file_name,'/'))!==false){
                   
$file_name=substr($file_name, $pos+1) ;
                }
               
$message=str_replace($file,$file_name,$message);
            }
        }
   
$description=$message;
   
$Exception=$message;
   
$subject=str_replace("'","\'",$message);
            if(
strpos($Exception,'Integrity constraint violation')!==false){
               
$Exception='Cannot delete this document/item, while it has references. ';
            }
            if(
$e instanceof PDOException){
                if(
strpos($Exception,':')!==false){
                   
$Exception=explode(':',$Exception )[1];
                }
            }

   
$file=replace_file_mtime($e->getFile());
   
//$file_name=$file;//basename($file);
   
$file_name=basename($file);
        if((
$pos=strrpos($file_name,'\\'))!==false){
           
$file_name=substr($file_name, $pos+1) ;
        }elseif((
$pos=strrpos($file_name,'/'))!==false){
           
$file_name=substr($file_name, $pos+1) ;
        }
   
$line=$e->getLine();
    if(
class_exists('Route') && Route::$request!==null){
       
$url=url('/');
       
$back=Route::$request->previous();
       
$error_dispaly=Route::$request->ajax()?'':'none';
    }else{
       
$url='';
       
$back='';
       
$error_dispaly='';
    }

   
$trace_head='
        <tr>
            <th>
                <h3 class="trace-class">
                    <span class="text-muted">'
.$code.'</span>
                    <span class="exception_title"><abbr title="'
.$file_name.'">'.$message.'</abbr></span>
                </h3>
                <p class="break-long-words trace-message"></p>
            </th>
        </tr>
    '
;
   
$trace_body='
        <tr>
            <td>
                <span class="block trace-file-path">in
                    <a title="'
.$file.'">
                        <strong>'
.$file_name.'</strong> line '.$line.'</a>
                </span>
            </td>
        </tr>
    '
;
    if ( !
function_exists( 'is_iterable' ) ){
        function
is_iterable( $obj ){
            return
is_array( $obj ) || ( is_object( $obj ) && ( $obj instanceof \Traversable ) );
        }
    }
    foreach(
$trace as $key=>$val){
        
       
$file=replace_file_mtime(isset($val['file'])?$val['file']:'');
               
       
//$file_name=$file;
       
$file_name=basename($file);
                if((
$pos=strrpos($file_name,'\\'))!==false){
                   
$file_name=substr($file_name, $pos+1) ;
                }elseif((
$pos=strrpos($file_name,'/'))!==false){
                   
$file_name=substr($file_name, $pos+1) ;
                }
       
$line=isset($val['line'])?$val['line']:0;
       
$function=isset($val['function'])?$val['function']:'';
            if(
$function==='error_handler'){
                continue;
            }
               
$s_name=$file_name;
               
//if(($pos=strrpos($file_name,'\\'))!==false){
                // $s_name=substr($file_name, $pos+1) ;
                //}elseif(($pos=strrpos($file_name,'/')+1)!==false){
                // $s_name=substr($file_name, $pos) ;
                //}
               
       
$class=isset($val['class'])?$val['class']:explode('.',$s_name)[0];
       
$type=isset($val['type'])?$val['type']:'';
       
$args=isset($val['args'])?$val['args']:[];
       
$s_args='<em>object</em>(
                            <abbr title="Phpnopea\Http\Request">Request</abbr>),
                            <em>object</em>(<abbr title="Closure">Closure</abbr>)
            '
;
            if(
$class==='DB' && count($args)>1 ){
                   
$sql=$args[0];
                if(
is_string($sql)){
                       
$bindings=$args[1];
                    if(
is_iterable($bindings) ){
                        foreach(
$bindings as $value){
                            if(
is_string($value)){
                               
$value="'".$value."'";
                            }elseif(
$value instanceof DateTimeInterface){
                               
$value="'".$value->format('Y-m-d H:i:s')."'";
                            }elseif(
is_bool($value)){
                               
$value=(int)$value;
                            }elseif(
is_object($value)){
                               
$value=get_class($value);
                            }elseif(
is_numeric($value)){
                               
$value=$value;
                            }else{
                               
$value=gettype($value);
                            }
                           
                                   
$pos=strpos($sql,'?');
                                if(
$pos!==false){
                                   
$sql=substr($sql, 0, $pos) .$value.substr($sql, $pos+ 1 ) ;
                                }
                           
                        }
                    }
                   
$s_args='"'.$sql.';"';
                }else{
                   
$s_args=is_object($sql)?get_class($sql):gettype($sql);
                }
            }else{
               
                   
$s_args='';
                foreach(
$args as $item){
                    if(
$s_args!==''){
                       
$s_args.=',';
                    }
                   
                    if(
is_string($item)){
                       
$item=replace_file_mtime($item);
                       
$item=basename($item);
                        if((
$pos=strrpos($item,'\\'))!==false){
                           
$item=substr($item, $pos+1) ;
                        }elseif((
$pos=strrpos($item,'/'))!==false){
                           
$item=substr($item, $pos+1) ;
                        }
                       
$item="'".$item."'";
                    }elseif(
is_numeric($item)){
                       
                    }else{
                       
$item='('.gettype($item).')';
                    }
                   
$s_args.=$item;
                }
            }
        
       
$trace_body.='
            <tr>
                <td>at <span class="trace-class"><abbr title="'
.$file_name.'">'.$class.'</abbr></span>
                    <span class="trace-type">'
.$type.'</span>
                    <span class="trace-method">'
.$function.'</span>(<span class="trace-arguments">'.$s_args.'</span>)
                    <span class="block trace-file-path">in
                        <a title="'
.$file.'">
                            <strong>'
.$file_name.'
                            </strong> line '
.$line.'</a>
                    </span>
                </td>
            </tr>
        '
;
        
    }
       
$file_name= 'error_'.$code.'_' .date("d-M-Y_H-i-s",time()).'.html';
       
$path= $storage_path.'errors' ;
            if(!
is_dir($path)){
               
mkdir($path);
            }
       
   
$keys=['{{Code}}','{{Exception}}','{{Explanation}}','{{url}}','{{back}}','{{trace_head}}','{{trace_body}}','{{error_file}}','{{subject}}'];
   
$changes=[$code,$Exception,$description,$url,$back,$trace_head,$trace_body,$file_name,$subject];
   
$html=str_replace($keys,$changes,$exception);
    echo
$html;
           
$file=$path.'/'.$file_name;
       
file_put_contents($file,$html);
    exit;
}