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

Excesso de Redirecionamento

Bom dia pessoal, tudo certo? Estou criando meu primeiro middleware utilizando o Láravel, e estou com a seguinte dificuldade.

Passos realizados:

  • Criei uma rota inicial chamada de "getToken" que aponta para meu "controller@getToken";
Route::get('/getToken', 'meuController@GetToken');
  • Criei meu controlador com o método "getToken", e como parâmetro já recebo uma "getTokenRequest $request" para validação dos dados;
//MÉTODOS GET
public function GetToken(getTokenRequest $request)
{
    echo "olá";
}
  • Então criei uma Request "getTokenRequest" contendo as regras básicas das variáveis no método "rules";
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;

class getTokenRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(Request $request)
    {
        //Validação de parâmetros de Entrada
        return [
            'Ip' => 'required|integer|size:6',
        ];
    }

    public function messages()
    {
        return [
            //"Ip.required" => "Preencha :attribute",
        ];
    }
}

Ocorre que ao acessar a rota "http://127.0.0.1:8000/getToken?Ip=123456" ele não carrega a página e nem me retorna nenhum erro, fica processando, processando...e exibe a mensagem de "Esta página não está funcionando - Redirecionamento em excesso por 127.0.0.1";

Eu não adicionei nenhum redirecionamento na tratativa, acredito que seja algo nativo. Saberiam se tem algo errado no processo ou como retirar o redirecionamento para ver o retorno da validação?

Lembrando que não é uma aplicação web então não estou utilizando views, esse retorno deveria estar sendo em json na própria tela.

6 respostas

Edwin, você definiu que o Request precisaria ter a informação Ip, mas na verdade você passou como uma query string.

A classe de validação de request valida o corpo da requisição, não a URL.

Ahh entendi Vinicius, então para fazer validação de URL eu faço no próprio controller? Ou posso estender alguma outra classe Request para isso?

Pq eu criei uma nova Request apenas por questões de organização e retirar a validação do Controller a princípio.

Edwin, eu adicionaria um parâmetro na URL ao invés de usar query string. Aí você pode colocar algumas validações também:

https://laravel.com/docs/5.8/routing#parameters-regular-expression-constraints

Entendi, Na verdade o acesso à minha aplicação será realizado via ajax, então a passagem dos parâmetros já são pela url, exemplo:

www.application.com.br/getToken?cnpj=123456789123

O link que você mandou pelo que entendi seria mais pra tratamento da URL amigável né? Aí converteria a URL acima para a abaixo:

www.application.com.br/getToken/123456789123

De qualquer forma aí já seria uma outra questão, ainda com essa validação eu preciso validar por exemplo no caso acima se é um CNPJ válido, por exemplo, e para isso que criei um GetTokenRequest, para tratar todos os parâmetros de entrada nela, além dasa validações básicas de number, lenght, et...isso é errado então se tratando de GET?

Devo fazer essa validação diretamente no meu Controller?

Entendi, Na verdade o acesso à minha aplicação será realizado via ajax, então a passagem dos parâmetros já são pela url, exemplo:

www.application.com.br/getToken?cnpj=123456789123

O link que você mandou pelo que entendi seria mais pra tratamento da URL amigável né? Aí converteria a URL acima para a abaixo:

www.application.com.br/getToken/123456789123

De qualquer forma aí já seria uma outra questão, mesmo fazendo dessa forma vou precisar de validações mais complexas, como por exemplo no caso acima verificar se é um CNPJ válido, por exemplo, então a idéia era centralizar todas essas validações na classe GetTokenRequest, antes de chegar ao controlador.

O query string eu só utilizei para recuperar os valores informados na URL, como foi ensinado do curso.

Parece que consigo jogar as validações no método "authorize" ao invés de usar o "rules", mas não sei se é o correto.

solução!

Então, Edwin... O FormRequest só trata os dados no corpo da requisição.

Se você tem alguma regra além de expressões regulares que vão ser aplicadas em parâmetros da query string ou da URL (como params mesmo), então as opções mudam.

Você pode no Controller chamar uma classe específica de validação desse parâmetro, você pode estender a validação como essa resposta sugere: https://stackoverflow.com/questions/30238285/laravel-5-how-to-validate-route-parameters

Enfim, existem várias saídas possíveis