Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Enviar dados de um jQuery para o controlador - PHP, JS e Laravel

Olá, pessoal. Tudo certo com vocês? Estou com um problema no meu código, já tentei verificar outras perguntas aqui mas não consegui achar algo parecido com o meu problema, acredito que seja algo simples, pois estou iniciando em JS, jQuery e PHP (fazendo os cursos aqui da Alura). Mas vamos ao problema, quando envio dados do jQuery para o controlador, as informações não estão sendo emitidas, já tentei de tudo e não consegui identificar. Antes de serem enviadas, utilizei o console.log e verifiquei que no jQuery está funcionando, mas ao receber no controlador, a variável $request vem vazia. O que estou fazendo de errado? O que acho mais estranho, é que no arquivo script.js tem o processo #segundaDose, que chama a função getCalculoSegundaDose que está funcionando perfeitamente, mesmo com o método get. Não consigo entender qual o motivo das informações não serem recebidas pelo CalculadoraController, para realização dos cálculos.

Um resumo sobre o sistema: é um site simples, onde a pessoa coloca a data de vacinação e o sistema informa quando deverá tomar a segunda dose, ou a terceira dose. No caso da segunda dose, está funcionando perfeitamente, os erros aparecem somente no script que envia os dados para a terceira dose.

Segue meu código para verificarem:

SCRIPT JS


// -- SEGUNDA DOSE  --
//Função que paga os dados do form, enviam para o controller e 
//devolvem para impressão na tela da próxima data para vacinação

$('#segundaDose').submit(function(e){
    e.preventDefault();

    var dataForm = $('#segundaDose').serialize();

    getCalculoSegundaDose(dataForm);
});

function getCalculoSegundaDose(dataForm) {

    var url = window.location;

    $.ajax({
        url: url.origin+'/segundaDose', 
        type: 'GET',
        data: dataForm,
        dataType: 'json',
        success: function(result){
            var data = result.data.split('-').reverse().join('/');
            var resultado = result.resultado.replace(/-/g, "/");

            $('#respostaCalculo').prepend('<div class="alert alert-info mt-2" align="center" role="alert">Como você tomou a primeira dose em <strong> ' + data + ' </strong>,<br><strong>você poderá tomar a segunda dose da ' + result.vacina +' a partir de ' + resultado +  '. </strong></div>');
        },
        error: function(){
            $('#respostaCalculo').prepend('<div class="alert alert-warning mt-2 alignb="center">Não foi possível realizar o cálculo, por favor, tente novamente fornecendo a Vacina e Data da Vacinação.</div>');
        }
    });
}


// -- TERCEIRA DOSE  --

$('#terceiraDose').submit(function(e){
    e.preventDefault();

    var dataForm1 = $('#terceiraDose').serialize();

    getCalculoTerceiraDose(dataForm1);

});

function getCalculoTerceiraDose(dataForm1){

    var url = window.location;

    //Aqui a informação chega corretamente
    console.log(dataForm1); 

    $.ajax({
        ur: url.origin+'/terceiraDose',
        type: 'GET',
        data: dataForm1,
        dataType: 'json',
        success: function(result){
            console.log(result);
            var data = result.data.split('-').reverse().join('/');
            var resultado = result.resultado.replace(/-/g, "/");

            $('#respostaTerceiraDose').prepend('<div class="alert alert-info mt-2" align="center" role="alert">Como você tomou a segunda dose em <strong> ' + data + ' </strong>,<br><strong>você poderá tomar a terceira dose a partir de ' + resultado +  '. </strong></div>');
        },
        error: function(){
            $('#respostaTerceiraDose').prepend('<div class="alert alert-warning mt-2 alignb="center">Não foi possível realizar o cálculo, por favor, tente novamente fornecendo a data da segunda dose.</div>');
        }
    });
}

ROTAS

Route::get('calculadora', [CalculadoraController::class, 'index'])->name('calculadora_index');
Route::get('segundaDose', [CalculadoraController::class, 'segundaDose'])->name('segundaDose');
Route::get('terceiraDose', [CalculadoraController::class, 'terceiraDose'])->name('terceiraDose');
5 respostas

Como não coube tudo na primeira mensagem, segue a continuação:

Controller

<?php

namespace App\Http\Controllers;

use App\Http\Requests\TerceiraDoseRequest;
use Illuminate\Http\Request;

class CalculadoraController extends Controller
{

    public function index()
    {
        return view('calculadora.index');
    }

    public function segundaDose(Request $request)
    {
        $vacina = $request->marcaVacina;
        $data = $request->primeiraDose;

        //Dias de espera para tomar a segunda dose de acordo com cada vacina.
        $astraZeneca = 1;
        $coronavac = 2;
        $jansenReforco = 3;
        $pfizer = 4;

        // Este switch/case verifica qual vacina foi a selecionada, chama o método calcularSegundaDose e atribui
        // os dias que precisam para calcular a data da terceira dose.
        if($data != 'null' && $vacina != 'null'){
            switch ($vacina) {
                case 'AztraZeneca':
                    $segundaDose = $this->calcularSegundaDose($astraZeneca, $data);
                    $status = true;
                    break;

                case 'Coronavac':
                    $segundaDose = $this->calcularSegundaDose($coronavac, $data);
                    $status = true;
                    break;

                case 'Jansen':
                    $segundaDose = $this->calcularSegundaDose($jansenReforco, $data);
                    $status = true;
                    break;

                case 'Pfizer':
                    $segundaDose = $this->calcularSegundaDose($pfizer, $data);
                    $status = true;
                    break;
                default:
                    $segundaDose = 'Por favor, selecione uma das vacinas liberadas.';
                    $status = false;
                    break;
            }
        }

        return json_encode(['resultado' => $segundaDose, 'vacina' => $vacina, 'data' => $data, 'status' => $status]);        
    }

    public function calcularSegundaDose(int $vacina, string $datainicio)
    {
        ini_set('date.timezone','America/Sao_Paulo');
        $datatermino = date('d-m-Y', strtotime("+".$vacina."days", strtotime($datainicio)));

        return $datatermino;
    }

    public function terceiraDose(Request $request)
    {
        $prazo = 4;
        $data = $request->dataSegundaDose;

        // Neste echo é possível verificar que os dados do $request estão vazios.
        echo 'Data: '.$request->dataSegundaDose.'<br>Prazo: '.$prazo . '<br>Teste:' ;
        exit();

        // Aparentemente, o $data está vindo com valor null, o que acaba gerando erro no cálculo.

        ini_set('date.timezone','America/Sao_Paulo');
        $dataTerceiraDose = date('d-m-Y', strtotime("+".$prazo."months", strtotime($data)));

        return json_encode(['resultado' => $dataTerceiraDose, 'data' => $data]);
    }

}

Estou usando o Laravel 8, PHP 8.0 e jQuery 3.6 pra fazer este projeto. Conforme dito anteriormente, a função para cálculo da segunda dose funciona perfeitamente, somente a terceira dose que apresenta o problema.

Você está importando o Request errado, você está importando o :

use Illuminate\Http\Request;

Quando na verdade deveria importar o da Facade:

use Illuminate\Support\Facades\Request;

João, conseguiu resolver?

@Elnata.costa Fiz a alteração sugerida, mas por algum motivo, também não tinha resolvido. Mudei algumas coisas no código e resolvei, não sei exatamente quais foram, mas no fim, deu certo. Hahahah

Vou postar abaixo o código alterado, que está funcionando:

Controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class CalculadoraController extends Controller
{

    public function index()
    {
        return view('calculadora.index');
    }

    public function segundaDose(Request $request)
    {
        $vacina = $request->marcaVacina;
        $data = $request->primeiraDose;

        //Dias de espera para tomar a segunda dose de acordo com cada vacina.
        $astraZeneca = 56;
        $coronavac = 28;
        $jansenReforco = 61;
        $pfizer = 56;

        // Este switch/case verifica qual vacina foi a selecionada, chama o método calcularSegundaDose e atribui
        // os dias que precisam para calcular a data da terceira dose.
        if($data != 'null' && $vacina != 'null'){
            switch ($vacina) {
                case 'AztraZeneca':
                    $segundaDose = $this->calcularSegundaDose($astraZeneca, $data);
                    $status = true;
                    break;

                case 'Coronavac':
                    $segundaDose = $this->calcularSegundaDose($coronavac, $data);
                    $status = true;
                    break;

                case 'Jansen':
                    $segundaDose = $this->calcularSegundaDose($jansenReforco, $data);
                    $status = true;
                    break;

                case 'Pfizer':
                    $segundaDose = $this->calcularSegundaDose($pfizer, $data);
                    $status = true;
                    break;
                default:
                    $segundaDose = 'Por favor, selecione uma das vacinas liberadas.';
                    $status = false;
                    break;
            }
        }

        return json_encode(['resultado' => $segundaDose, 'vacina' => $vacina, 'data' => $data, 'status' => $status]);        
    }

    public function calcularSegundaDose(int $vacina, string $datainicio)
    {
        ini_set('date.timezone','America/Sao_Paulo');
        $datatermino = date('d-m-Y', strtotime("+".$vacina."days", strtotime($datainicio)));

        return $datatermino;
    }

    public function terceiraDose(Request $request)
    {
        $prazo = 120;
        $prazoImuno = 28;
        $data = $request->dataSegundaDose;

        // // Neste echo é possível verificar que os dados do $request estão vazios.
        // echo 'Data: '.$request->dataSegundaDose.'<br>Prazo: '.$prazo . '<br>Prazo Imuno:' . $prazoImuno;
        // exit();

        // Aparentemente, o $data está vindo com valor null, o que acaba gerando erro no cálculo.

        ini_set('date.timezone','America/Sao_Paulo');
        $dataTerceiraDose = date('d-m-Y', strtotime("+".$prazo."days", strtotime($data)));
        $dataTerceiraDoseImuno = date('d-m-Y', strtotime("+".$prazoImuno."days", strtotime($data)));

        return json_encode(['resultado' => $dataTerceiraDose, 'resultadoImuno' => $dataTerceiraDoseImuno, 'data' => $data]);
    }

}
solução!

E como não coube na mensagem anterior...

Script jQuery


// -- SEGUNDA DOSE  --
//Função que paga os dados do form, enviam para o controller e 
//devolvem para impressão na tela da próxima data para vacinação

$('#segundaDose').submit(function(e){
    e.preventDefault();

    $('#respostaCalculo').html('');

    var dataForm = $('#segundaDose').serialize();
    var data = $('#primeiraDose').val();

    var isValidDate = function(data) {
        return !!new Date(data).getTime();
    }
    if(isValidDate(data) === false){
        return alert("A data informada não é válida!");
    }

    getCalculoSegundaDose(dataForm);
});

function getCalculoSegundaDose(dataForm) {

    var url = window.location;

    $.ajax({
        url: url.origin+'/segundaDose', 
        type: 'GET',
        data: dataForm,
        dataType: 'json',
        success: function(result){
            var data = result.data.split('-').reverse().join('/');
            var resultado = result.resultado.replace(/-/g, "/");

            $('#respostaCalculo').prepend('<div class="alert alert-info mt-2" align="center" role="alert">Como você tomou a primeira dose em <strong>' + data + '</strong>,<br><strong>você poderá tomar a segunda dose da ' + result.vacina +' a partir de ' + resultado +  '. </strong></div>');
        },
        error: function(){
            $('#respostaCalculo').prepend('<div class="alert alert-warning mt-2 alignb="center">Não foi possível realizar o cálculo, por favor, tente novamente fornecendo a Vacina e Data da Vacinação.</div>');
        }
    });
}


// -- TERCEIRA DOSE  --

$('#terceiraDose').submit(function(e){
    e.preventDefault();

    $('#respostaTerceiraDose').html('');

    var dataForm1 = $('#terceiraDose').serialize();
    var data2Dose = $('#dataSegundaDose').val();

    var isValidDate = function(data2Dose) {
        return !!new Date(data2Dose).getTime();
    }
    if(isValidDate(data2Dose) === false){
        return alert("A data informada não é válida!");
    }

    getCalculoTerceiraDose(dataForm1);

});

function getCalculoTerceiraDose(dataForm1){

    var url = window.location;    

    $.ajax({
        url: url.origin+'/terceiraDose',
        type: 'GET',
        data: dataForm1,
        dataType: 'json',
        success: function(result){
            var data = result.data.split('-').reverse().join('/');
            var resultado = result.resultado.replace(/-/g, "/");
            var resultadoImuno = result.resultadoImuno.replace(/-/g, "/");

            $('#respostaTerceiraDose').prepend('<div class="alert alert-info mt-2" align="center" role="alert">Como você tomou a segunda dose em <strong> ' + data + ' </strong>,<br><strong>você poderá tomar a terceira dose a partir de ' + resultado +  '. Porém, caso seja paciente imunossuprimido, poderá tomar a terceira dose a partir de ' + resultadoImuno + '.</strong></div>');
        },
        error: function(){
            $('#respostaTerceiraDose').prepend('<div class="alert alert-warning mt-2 alignb="center">Não foi possível realizar o cálculo, por favor, tente novamente fornecendo a data da segunda dose.</div>');
        }
    });
}

Muito obrigado a todos pela ajuda!