Analisando erros no Laravel de maneira menos dolorosa

Analisando erros no Laravel de maneira menos dolorosa

2 de junho de 2017 1 Por Ramos de Souza Janones
Como vender Software - Seja desktop, web ou MobilePowered by Rock Convert
Powered by Rock Convert

As melhores práticas sobre analise de erros no Laravel de maneira menos dolorosa.

Quem usa o Laravel há bastante tempo deve-se lembrar daquela bonita tela de erros/debug que era exibida no Laravel versão 4 quando a aplicação era interrompida por algum erro/exception.

blank

Você pode ver uma página demo neste link https://filp.github.io/whoops/demo .

Essa tela é do package filp/whoops que era fornecido junto ao core do Laravel 4.  Desde o lançamento do Laravel 5 esse package foi substituído pelo Symfony/Debug.

O Whoops é um package agnóstico (não é preso a um framework em específico) portanto, pode ser instalado via Composer em qualquer aplicação PHP moderna.  Sendo assim, neste post vou ensinar a como instala-lo corretamente no Laravel.

Curso de PHP ERP com NFe.

Atenção: Antes de colocarmos a mão na massa, vale reforçar que o Whoops é indicado apenas em ambiente de desenvolvimento, afinal,  não seria interessante  exibir uma tela de erros com um alto nível de detalhes e informações sigilosas para o usuário da sua aplicação.

1º – Passo

Editar o arquivo composer.json e adicionar o Whoops como dependência de desenvolvimento, veja:

 "name": "laravel/laravel",
 "description": "The Laravel Framework.",
 "keywords": ["framework", "laravel"],
 "license": "MIT",
 "type": "project",
 "require": {
 "php": ">=5.6.4",
 "laravel/framework": "5.3.*",
 "laravel/tinker": "~1.0"
 },
 "require-dev": {
 "fzaninotto/faker": "~1.4",
 "mockery/mockery": "0.9.*",
 "phpunit/phpunit": "~5.7",
 "filp/whoops": "2.1.*"
 },

O correto é adiciona-lo no índice require-dev, conforme o exemplo acima, isso facilita na hora do Deploy, pois basta executar o comando composer install –no-dev que tais dependências não serão baixadas em ambiente de produção.

2º – Passo:

Executar o comando composer update para atualizarmos as dependências e obviamente baixar todas as classes do Whoops.

3º – Passo:

Conforme mencionei anteriormente, esse package é agnóstico, sendo assim, ele não vem com um ServiceProvider onde possamos registrá-lo no arquivo config\app.php, conforme estamos acostumados com a instalação de outros packages Laravel.

Para “registrar” o Whoops em nossa aplicação vamos abrir o arquivo app/Exceptions/Handler.php e vamos adicionar um método que sera responsável por repassar os erros para o Whoops renderizar, veja:

<?php
    /**
     * Render an exception using Whoops.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception $e
     * @return \Illuminate\Http\Response
     */
    protected function renderExceptionWithWhoops($request, Exception $e)
    {
        $whoops = new \Whoops\Run;
        if ($request->ajax()) {
            $whoops->pushHandler(new \Whoops\Handler\JsonResponseHandler());
        } else {
            $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler());
        }
        return new \Illuminate\Http\Response(
            $whoops->handleException($e),
            $e->getStatusCode(),
            $e->getHeaders()
        );
    }

No método acima, instanciamos a classe Whoops, depois registramos o Handler que será responsável por fazer o ‘parse’ do erro, note que nesta etapa fizemos uma verificação se a requisição é  AJAX ou não, se for AJAX o correto é retorna um JSON e não uma página HTML; Por fim,  retornamos uma Response com todos os dados já formatados.

Com nosso método criado, devemos agora desviar o fluxo das exceptions para ele, podemos fazer isso de maneira fácil editando o método render() ainda dentro do arquivo Handler.php, veja:

Powered by Rock Convert
<?php
    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
         if (config('app.debug') && config('app.env') == 'local') {
            return $this->renderExceptionWithWhoops($request, $exception);
        }
        return parent::render($request, $exception);

Perceba que restringimos a renderização do Whoops apenas em ambiente local com debug ativado.

Segue abaixo o arquivo Handler.php completo:

<?php
namespace App\Exceptions;
use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [
\Illuminate\Auth\AuthenticationException::class,
\Illuminate\Auth\Access\AuthorizationException::class,
\Symfony\Component\HttpKernel\Exception\HttpException::class,
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
\Illuminate\Session\TokenMismatchException::class,
\Illuminate\Validation\ValidationException::class,
];
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param  \Exception  $exception
* @return void
*/
public function report(Exception $exception)
{
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Exception  $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
if (config('app.debug') && config('app.env') == 'local') {
return $this->renderExceptionWithWhoops($request, $exception);
}
return parent::render($request, $exception);
}
/**
* Convert an authentication exception into an unauthenticated response.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Illuminate\Auth\AuthenticationException  $exception
* @return \Illuminate\Http\Response
*/
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest('login');
}
/**
* Render an exception using Whoops.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Exception $e
* @return \Illuminate\Http\Response
*/
protected function renderExceptionWithWhoops($request, Exception $e)
{
$whoops = new \Whoops\Run;
if ($request->ajax()) {
$whoops->pushHandler(new \Whoops\Handler\JsonResponseHandler());
} else {
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler());
}
return new \Illuminate\Http\Response(
$whoops->handleException($e),
$e->getStatusCode(),
$e->getHeaders()
);
}
}

Pronto! Agora você pode forçar um erro na sua aplicação para visualizar a sua mais nova e elegante tela de Debug.

P.S.( Neste exemplo, utilizei o Laravel 5.4 e Whoops 2.1.5. Mas, você pode aplicar isso para qualquer versão >= 5 sem muito esforço.. )

Outros tutoriais e dicas sobre PHP:

Gostou da dica? Viu algum erro? Não conseguiu implementar? Comente!

Aproveitando, segue nossa indicação:

Curso de Laravel – Plataforma EAD (LaraSchool), foi criado pelaEspecializaTi. Resumidamente: Neste curso você vai aprender a criar uma plataforma ead multi usuários, onde qualquer pessoa pode se cadastrar no sistema e postar cursos e comercializar e ainda aprenderá como integrar o Laravel com um dos gateways de pagamentos mais famosos que existem para produtos digitais, o HotMart. Espero que goste desta dica! 😉

Subscribe to our mailing list

* indicates required


Além de PHP e MySQL, deseja receber outro tema?

LEIA TAMBÉM:  O que é a Kotlin Standard Library

Email Format


» Programação 

Powered by Rock Convert
Siga os bons!
Últimos posts por Ramos de Souza Janones (exibir todos)
vote
Article Rating
LEIA TAMBÉM:  Boletos bancário open-source em PHP