Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, estou com um probleminha que não faz muit sentido para mim.
Na minha View, no método que renderiza o Templte, tenho isso:
public function render( $name = NULL ) {
if( ! $this -> _shouldRender ) {
return;
}
$this -> _isRendered = TRUE;
ob_start();
include $this -> findFile( $name );
$data = ob_get_contents();
ob_end_clean();
echo $data;
}
Simples assim. View::findFile(), como o nome sugere, apenas encontra o caminho completo do Template passado, nada mais. e, por isso, não vem ao caso.
Pois bem, para evitar ter que fazer, em cada action, de cada controller:
$this -> view -> render()
Isto é, renderizar manualmente, decidi colocar, no destrutor da classe abstrata de controllers isso:
public function __destruct() {
if( $this -> view instanceof IView && ! $this -> view -> isRendered() ) {
$this -> view -> render();
}
}
Assim, quando o controller fosse destruído, o Template seria renderizado automaticamente.
Nota: Tive que colocar o instanceof para ter certeza de que o objeto presente na propriedade $view é de fato uma View válida.
Tudo muito lindo e funcionando as mil maravilhas até que implementei as Exceptions. Todas as minhas Exceções extendem de uma única (ver abaixo) que por sua vez extende da Exception nativa.
class Exception extends \Exception {
/**
* Placeholders Replacements
*
* @var array $replacements
*/
private $replacements = array();
/**
* Exception Constructor
*
* @param string|optional $message
* @param string|integer|optional $code
* @param array|optional $args
*/
public function __construct() {
$args = func_get_args();
// Shifting the Message
$message = array_shift( $args );
// Constructing Parent
parent::__construct( $message, 0 );
// Setting Up Placeholders Replacements
$this -> replacements = (array) $args;
}
/**
* Translates Exception's Message Placeholders
*
* @return string
*/
public function __toString() {
return vsprintf( $this -> getMessage(), $this -> replacements );
}
Eu acreditava estar tudo perfeito. Mas a renderização automática do Template, feita no destrutor dos Controllers, está, quando uma Exceção é disparada, entrando no que parece ser um loop infinito.
Revisei todo o código, desde o Bootstrap até a View, passando pelo Roteador, Controller e etc. e está tudo em ordem.
Tanto é que se comento o destrutor e volto a renderizar manualmente, o problema pára, isto é, se houver uma exceção a mesma é direcionada para handler customizado (ver abaixo) e a execução é interrompida, caso contrário continua e renderiza (manualmente).
A saber, o handler de Exceção customizado é:
class ExceptionHandler {
/**
* Handles the Exception
*
* @param Exception $e Exception thrown
*
* @return void
*/
public function handle( \Exception $e ) {
include dirname( __FILE__ ) . '/Exception/Handler/Layout.phtml';
}
}
Nada mais que isso, apenas para mostrar de forma elegante as exceções não capturadas.
Alguém sabe o que pode ser?
Carregando comentários...