Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Erro 500 - Ajax Laravel

Boa tarde pessoal, estou com problemas para fazer uma consulta via Ajax. "POST http://localhost:8000/cheques/ajaxcheque 500 (Internal Server Error)"

routes.php

Route::post('cheques/ajaxcheque', 'Financeiro\ChequeController@ajaxCheque');

Controller.php

 public function __construct() {
        $this->middleware('auth');
        $this->cheque = new Cheque();
    }
public function ajaxCheque() {
        $id=addslashes(Request::input('id'));
        if (intval($id) > 0) {
            $cheque = Cheque::find($id);
            if (!is_null($cheque)) {
                $json = json_enconde($cheque);
                return response()->json($json,200);
            } else {
                $json = json_enconde(array('error'=>"Registro não encontrado!"));
                return response()->json($json,200);
            }
        } else {
                $json = json_enconde(array('error'=>"Registro não encontrado!"));
                return response()->json($json,200);
        }
    }

View

<form>
<input type="hidden" id="token" name="_token" value="{{ csrf_token() }}" />
</form>

<script>
function ajaxCheque(id){
                            var formData = new FormData();
                            var token= $("#token").val();
                            formData.append('id', id);
                            formData.append('_token',token);
                            $.ajax({
                            url: '{{URL::to("/cheques/ajaxcheque")}}',
                                    type: 'post',
                                    headers: {'X-CSRF-TOKEN': token},
                                    data: formData,
                                    dataType: 'json',
                                    cache: false,
                                    processData: false,
                                    success: function(result) {
                                        console.log("Entrou aqui!");
//                                    alert(result);
                                    }
                            })
                            }
</script>

Alguém consegue me auxiliar nessa questão?Por que está ocorrendo esse erro se estou enviando o 'token' para a controller? É necessário criar outro Middleware só para as requisições Ajax?

Desde já agradeço qualquer apoio.

11 respostas

Olá, Rudimar Kaspar

Poderia por favor postar o código do controller completo, para que possamos realizar a análise?

Caso você esteja rodando a aplicação pelo servidor embutido do PHP, insira aqui as mensagens de erro que ele está exibindo também.

Por favor, onde está sendo chamado o ajaxCheque(id) na view, qual o gatilho para executar a requisição, e onde está sendo passado o id que a função solicita?

Aproveitando abaixo segue dica de refactoring para o método ajaxCheque.

public function ajaxCheque() 
{
    // Coleta do id, forçando o tipo
    $id = (int)Request::input('id');

    // tentativa de pesquisa.
    $cheque = Cheque::find($id);

    // verificação dos dados.
    if($id <= 0 || is_null($cheque)){
        $result = json_enconde( ['error' => 'Registro não encontrado!']);

        return response()->json($result, 404);
    }

    $result = json_enconde($cheque);

    return response()->json( $result, 200 );
}

No aguardo.

Att,

Diego Brocanelli

Olá Diego, obrigado pelo retorno. Neste caso estou listando na View o cadastro de Cheques em uma tabela, quando o usuário clica no registro do Cheque (onclick) é chama a função ajaxCheque(id). Ao renderizar a página o php 'injeta'o id do cheque dentro da função, conforme código abaixo.

 <th onclick="ajaxCheque('{{$cheque->id}}');"><center>{{$cheque->numero}}</center></th>

Então, gostaria que ele retornasse os dados detalhados do cheque após essa ação.

Código Controller:

<?php

namespace app\Http\Controllers\Financeiro;

use app\Http\Controllers\Controller;
use app\Http\Requests\Financeiro\ChequeRequest;
use app\Model\Cheque; /* Importacao da Model */
use app\Model\Banco;
use Session;
use Request;

class ChequeController extends Controller {

    private $filtrarView = 'pages.financeiro.cheque.filtrar';
    private $listarView = 'pages.financeiro.cheque.listar';
    private $novoView = 'pages.financeiro.cheque.novo';
    private $exibirView = 'pages.financeiro.cheque.exibir';
    private $viewRetorno = 'Financeiro\ChequeController@filtrar';
    //private $viewRetorno = 'Financeiro\ChequeController@listar';
    private $cheque = null;
    private $breadcrumb = array('Home' => '/home', 'Financeiro' => '#', 'Cheques' => '/cheques');

    public function __construct() {
        $this->middleware('auth');
        $this->cheque = new Cheque();
    }

    /**
     * Exibe a tela de filtro
     *
     * @return Response
     */
    public function filtrar() {
        if (view()->exists($this->filtrarView)) {
            Session::flash('titulo-panel', 'Filtro Cheque');
            $banco = new Banco();
            $bancos = $banco->get()->sortBy('nome');
            $breadcrumb = $this->breadcrumb;
            return view($this->filtrarView)->with('breadcrumb', $breadcrumb)->with('bancos', $bancos);
        } else {
            return "";
        }
    }

    /**
     * Exibe a lista com base nos filtros.
     *
     * @return Response
     */
    public function listar() {
        if (view()->exists($this->listarView)) {
            Session::flash('titulo-panel', 'Cheques');
            $banco = addslashes(Request::input('idBanco'));
            $conta = addslashes(Request::input('conta'));
            $valor = addslashes(Request::input('valor'));
            $valor = addslashes(formataNumSQL($valor));
            $data_cheque = addslashes(formataDataSQL(Request::input('data_cheque')));
            $data_final = addslashes(formataDataSQL(Request::input('data_final')));
            $parametros = array();

            if (intval($banco) > 0) {
                $parametros = array_merge($parametros, array('idBanco' => $banco));
            }
            if ($data_final != "") {
                $parametros = array_merge($parametros, array('data_final' => $data_final));
            }
            if ($data_cheque != "") {
                $parametros = array_merge($parametros, array('data_cheque' => $data_cheque));
            }
            if ($valor != "") {
                $parametros = array_merge($parametros, array('valor' => $valor));
            }

            $cheque = new Cheque();
            $cheques = $cheque->where("conta", "like", "%{$conta}%")->where($parametros)->get();
            $breadcrumb = array_merge($this->breadcrumb, array('Lista' => '#'));
            return view($this->listarView)->with('breadcrumb', $breadcrumb)->with('cheques', $cheques);
        } else {
            return "";
        }
    }

    /**
     * Exibe a view com o formulario de preenchimento para um novo item.
     *
     * @return Response
     */
    public function novo() {
        if (view()->exists($this->novoView)) {
            Session::flash('titulo-panel', 'Cadastrar novo cheque');
            $banco = new Banco();
            $bancos = $banco->get()->sortBy('nome');
            $breadcrumb = array_merge($this->breadcrumb, array('Cadastrar novo cheque' => '#'));
            return view($this->novoView)->with('breadcrumb', $breadcrumb)->with('bancos', $bancos);
        } else {
            Session::put('error', 'Página não encontrada!');
            return redirect()->action($this->viewRetorno);
        }
    }

//    /**
//     * Salva no banco os dados preenchidos na view.
//     *
//     * @return Response
//     */
    public function salvar(ChequeRequest $request) {

        Cheque::create($request->all());
        Session::put('success', "Cheque adicionado com sucesso!");
        return redirect()->action($this->viewRetorno);
    }
//continua
public function exibir($id) {
        if (view()->exists($this->exibirView)) {
            Session::flash('titulo-panel', 'Editar cheque');
            $cheque = Cheque::find($id);
            $banco = new Banco();
            $bancos = $banco->get()->sortBy('nome');
            if (!is_null($cheque)) {
                $breadcrumb = array_merge($this->breadcrumb, array('Editar' => '#'));
                return view($this->exibirView)->with('breadcrumb', $breadcrumb)->with('cheque', $cheque)->with('bancos', $bancos);
            } else {
                Session::put('error', "Registro não encontrado!");
                return redirect()->action($this->viewRetorno);
            }
        } else {
            Session::put('error', 'Página não encontrada!');
            return redirect()->action($this->viewRetorno);
        }
    }

   public function atualizar(ChequeRequest $request) {
        $id = $request->input('id');
        $contaUpdate = Cheque::findOrFail($id);
        $input = $request->all();
        $contaUpdate->fill($input)->save();
        Session::put('success', "Cheque alterado com sucesso!");
        return redirect()->action($this->viewRetorno);
    }


    public function remover($id) {
        //intval
        $cheque = Cheque::find($id);
        if (!is_null($cheque)) {
            $cheque->delete();
            Session::put('success', "Cheque {$cheque->data_cheque} removido com sucesso!");
            return redirect()->action($this->viewRetorno);
        } else {
            Session::put('error', "Conta não encontrada!");
            return redirect()->action($this->viewRetorno);
        }
    }

    public function removerLista() {
        $ids = Request::input('cbxDeleta'); // array id's selecionados
        $qtd = count($ids);
        if ($qtd > 0) {
            foreach ($ids as $key => $id) {
                //intval
                $cheque = Cheque::find($id);
                if (!is_null($cheque)) {
                    $cheque->delete();
                }
            }
            Session::put('success', "{$qtd} cheques removidos!");
            return redirect()->action($this->viewRetorno);
        } else {
            Session::put('error', "Nenhum cheque selecionado!");
            return redirect()->action($this->viewRetorno);
        }
    }

    public function ajaxCheque() {
        // Coleta do id, forçando o tipo
        $id = (int) Request::input('id');

        // tentativa de pesquisa.
        $cheque = Cheque::find($id);

        // verificação dos dados.
        if ($id <= 0 || is_null($cheque)) {
            $result = json_encode(['error' => 'Registro não encontrado!']);

            return response()->json($result, 404);
        }

        $result = json_encode($cheque);

        return response()->json($result, 200);
    }
}

Verifiquei agora que não está mais ocorrendo o erro 500, mas a variável $id da função ajaxCheque() na Controller, não está recebendo os dados.

$id = (int) Request::input('id'); //está retornando 0

Existe algum problema na minha função JS na View? Posso usar FormData?

function ajaxCheque(id){
                            var formData = new FormData();
                            var token= $("#token").val();
                            formData.append('id', id);
                            formData.append('_token',token);
                            $.ajax({
                                    url: '{{URL::to("/cheques/ajaxcheque")}}',
                                    type: 'post',
                                    headers: {'X-CSRF-TOKEN': token},
                                    data: formData,
                                    dataType: 'json',
                                    cache: false,
                                    processData: false,
                                    success: function(result) {
                                           console.log("Entrou aqui!");
                                           alert(result);
                                    }
                            })
}

Olá, asasd

Nessa linha:

$id = (int) Request::input('id'); //está retornando 0

Está retornando zero, pois o id do input deve estar vindo vazio, com isso, como é forçado para inteiro ele converte para 0 (zero).

Verifique na view se o id está sendo informado no onclick.

Caso ele esteja sendo informado, tente a seguinte substituição na função javascript de ajax, sendo:

Substitua esse

data: formData,

Por esse

data: {
    id: id,
    _token:token
},

Observação: Por que suas namespaces app estão iniciando com letra minúscula? Sendo que o padrão é maiúscula App?

No aguardo do feedback

Att,

Diego Brocanelli

Diego, já tentei substituindo o formData pelo código que você me passou, mas mesmo assim a controller não recebe o conteúdo do Request::input('id') e já confirmei que os valores do id estão "chegando" até a função JS ajaxCheque(id);

Meu routes.php

Route::post('cheques/ajaxcheque', 'Financeiro\ChequeController@ajaxCheque');

Quanto a questão do App ou app eu só alterei na controller para abstrair o nome da aplicação que estou trabalhando.

Olá, Rudimar Kaspar.

Vamos refatorar a forma como coletamos os dados de post, sendo:

public function ajaxCheque(Request $request)
{
    $id =  (int)$request->input('id');

    // demais linhas do método

Com isso injetamos o objeto Resquest e coletamos o id.

No aguardo do feedback.

Att,

Fiz desta forma e retornou no prompt (php artisan serve) o seguinte erro:

 PHP Fatal error:  Call to undefined method Illuminate\Support\Facades\Request::input()

Tentei utilizar com outra classe Request, não retornou erro mas tbém não foi atribuído valor a variável $id.

    public function ajaxCheque(\Illuminate\Http\Request $request) {
        // Coleta do id, forçando o tipo
        $id = (int)$request->input('id');

Olá, Rudimar Kaspar.

Infelizmente, sem realizar debug fica muito complexo adivinhar o problemas, qual editor você usa, aconselho que rode o xdebug e acompanhe o processo para analisar os dados.

Uso o Netbeans, obrigado pelo retorno, vou continuar tentando e posto aqui assim que conseguir. Valeu.

solução!

Consegui resolver, meu código ficou desta forma:

routes.php

Route::post('cheques/ajaxcheque', 'Financeiro\ChequeController@ajaxCheque');

Controller:

public function ajaxCheque() {
        // Coleta do id, forçando o tipo
        $id = Request::input('id');

        // tentativa de pesquisa.
        $cheque = Cheque::find($id);

        // verificação dos dados.
        if ($id <= 0 || is_null($cheque)) {
            $result = json_encode(['error' => 'Registro não encontrado!']);
            return response()->json($result);
        }

        $result = json_encode($cheque);

        return response()->json($result);
    }

View:

function ajaxCheque(id) {
    var token = $("#token").val();
    $.ajax({
        url: '/cheques/ajaxcheque',
        type: 'POST',
        method: 'POST',
        dataType: 'json',
        ContentType: 'application/json',
        headers: {'X-CSRF-TOKEN': token},
        data: {'id': id, '_token': token},        
        success: function (response) {
            var json = $.parseJSON(response);
                console.log(json);
        }
    })
}

Obrigado Diego pelo apoio.