1

MVC を操作するクラスがいくつかあるとします。コントローラーの基本クラスには、コンストラクターとデストラクターがあります。

class BaseController {
    public function __construct() {
        ob_start();

    }

    # Some code here.

    public function __destruct() {
        if(!error_get_last()) {
            if(!$this->doNotOutputBuffer) {
                $controllerContent = ob_get_contents();
                ob_clean();
                $this->_template->render($this->_appinfo['directory'], $this->templateOptions, $controllerContent);
            } else {
                $this->_template->render($this->_appinfo['directory'], $this->templateOptions);
            }
        }
    }
}

各関数に ob_star() と ob_clean() が存在することに注意してください。ビュー データをテンプレート クラスに渡して、テンプレートでビューをレンダリングすることになっています。例外がスローされると、LoginController の外側の「TryCatch」ブロックでエラーをキャッチしますが、デストラクタは常に呼び出され、error_get_last() 関数は NULL を返します。とにかく、エラーがあってもビューが読み込まれます。

class LoginController extends BaseController{

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

    public function main() {    
        throw new Exception("Error Fatal...");
    }

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

}

ビューが表示されないという例外がいつ発生したかを知るにはどうすればよいですか?

4

1 に答える 1

0

フラグとラップ メソッドを追加します。

class LoginController extends BaseController{

    private $_is_throwed = false;

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

    public function main() {
        try{
            $this->_main();
        } catch (Exception $e) {
            $this->_is_throwed = true;
            throw $e;
        }
    }

    private function _main() {
        throw new Exception("Error Fatal...");
    }

    public function __destruct() {
        if (!$this->_is_throwed) {
            parent::__destruct();
        } else {
            ob_clean();
        }
    }

}

PS ただし、破棄でロジックを使用する場合は注意してください。問題が発生する可能性があります。

于 2013-04-25T00:26:01.527 に答える