2011-04-09 4 views
1

私はZend Toolが生成したデフォルトのErrorControllerを使用しています。私index.phpファイルが最初に行う事は例外にエラーと警告を変換エラーハンドラを登録することである。Bootstrapで生成されたエラーをErrorControllerに転送するにはどうすればよいですか?

function handleError($errno, $errstr, $errfile, $errline, array $errcontext) { 
    // error was suppressed with the @-operator 
    if (0 === error_reporting()) { 
     return false; 
    } 

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 

set_error_handler('handleError'); 

私もこれはindex.phpに設定している:

$front = Zend_Controller_Front::getInstance(); 
$front->throwExceptions(false); 

問題はそれということですブートストラップファイルからの例外を処理しません。例外は発生しますが、ErrorControllerは受け取っていません。ページの実行は単に停止し、ビューはレンダリングされません。

エラーコントローラを使用してすべての例外と警告をルーティングするにはどうすればよいですか(もちろん、構文と致命的なエラーは例外です)。

答えて

1

ブートストラップで例外が発生した場合は、アプリケーションがまだ設定されていないため、ErrorControllerについてまだわからないため、ErrorControllerには渡すことはできません。

あなたはそれを処理するために別のものを使用する必要があります。

ブートストラップにキャッチされていない例外を投げる可能性が高いアプリケーションを持つことは、必ずしも良いことではありません。ブートストラップで発生する例外をキャッチし、それに応じて処理する必要があります。

+0

私は同意します。私はブートストラップ内の操作が失敗するのではないかと疑います。私が想像することができる唯一のことは、データベースに接続することです。その場合は、単純なエラーページを表示するだけです。 –

2

ただし、データベースJIT(Just In Time)に接続しても問題はありません。 Front Controllerプラグインを使用して、ブートストラップ後にデータベース接続を実際に移動することができます。 DB接続設定は、他のものを設定する必要がない場合は(ルートや一部の翻訳前の翻訳など)、_dispatchLoopStartup()にすることができます。

//in bootstrap 
$front->registerPlugin(new Awesome_Db_Plugin($zendConfigWithDbOptions)); 
// in plugin (options injected via constructor to private member 
public function dispatchLoopStartup() { 
    $db = Zend_Db::factory($this->_options); 
    Zend_Registry::set('db', $db); 
} 

この方法では、DB接続時にスローされたすべての例外は、これが私のindex.phpからである$front->dispatch();

+0

これは素晴らしいアイデアです!ありがとう –

2

後に解雇され、それが役に立つだろうことがあります

//bootstrap, and run application 
try { 
    require_once 'Zend/Application.php'; 
    //create application and configure it. 
    $application = new Zend_Application(
     getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production', 
     array('config' => array(APPLICATION_PATH . DS . 'configs' . DS . 'application.ini')) 
    ); 
    //run application 
    $application->bootstrap()->run(); 
} catch (Exception $e) { 
    //fallback for uncatched exceptions 
    ob_clean(); 
    //ensure error will be logged and firephp backend, if enabled, will send log messages 
    if(is_object($application) 
     && $application->bootstrap('log') 
     && Zend_Registry::isRegistered('Zend_Log') 
    ) { 
     Zend_Registry::get('Zend_Log') 
      ->log($e,Zend_Log::CRIT); 
    } 
    $wildfire = Zend_Wildfire_Channel_HttpHeaders::getInstance(); 
    if(!($response = Zend_Controller_Front::getInstance()->getResponse())) { 
     $response = new Zend_Controller_Response_Http(); 
     $wildfire->setRequest(new Zend_Controller_Request_Http()); 
     $wildfire->setResponse($response); 
    } 
    if($response->canSendHeaders()) { 
     $response->clearHeaders(); 
     $response->setHttpResponseCode(500); 
     $wildfire->flush(); 
     $response->sendResponse(); 
    } 
    //put static html for error page here 
    echo 'Startup error occured. Try again later'; 
} 

ノートZend_Registry::isRegistered('Zend_Log') Zend_Logインスタンスが拡張アプリケーションリソースのレジストリに登録されています

関連する問題