Solucionado (ver solução)
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.