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

Dados recuperados com getParsedBody

Vinicius , Boa noite !

Refatorei o código mas estava(estou) tendo problemas com os headers.

Ele não identifica o indice e-mail, ou senha no Controller RealizarLogin.

Baixei o projeto do curso e vi que vc usou getParsedBody para pegar esses dados.

E no campo senha permaneceu com $senha =

$senha = filter_input(
            INPUT_POST,
            'senha',
            FILTER_SANITIZE_STRING
        );

Poderia me explicar melhor estes pontos? Havia entendido no decorrer do curso que viria tudo no fromGlobals(); e que pegaria como os headers.

Estou tentando consolidar este conmhecimento.

Desde já fico grato.

Paulo André

6 respostas

Paulo, você pode compartilhar o código todo do controller pra eu entender o que você quer dizer? Eu gravei o treinamento há algum tempo então não me lembro como está o código. rsrsrs

Esse é o meu.

<?php

namespace Alura\Cursos\Controller;

use Alura\Cursos\Entity\Usuario;
use Alura\Cursos\Helper\FlashMessageTrait;
use Doctrine\ORM\EntityManagerInterface;
use Nyholm\Psr7\Response;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\RequestHandlerInterface;

class RealizarLogin implements RequestHandlerInterface
{   
    use FlashMessageTrait;
    /**
     * @var \Doctrine\Common\Persistence\ObjectRepository 
     */

    private $repositorioDeUsuarios;

    public function __construct(EntityManagerInterface $entitymanager) {
        $this->repositorioDeUsuarios = $entitymanager->getRepository(Usuario::class);
    }
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $queryString = $request->getQueryParams();
        var_dump($queryString);
        $email = filter_var($queryString['email'],FILTER_VALIDATE_EMAIL);
        if (is_null($email) || $email === false) {
            $this->defineMensagem('danger','E-mail digitado não é um email válido');
            return new Response(302,['Location:' => '/login']);
        }
        $senha = filter_var($queryString['senha'],FILTER_SANITIZE_STRING);
        /**
         * @var Usuario $usuario
         */
        $usuario = $this->repositorioDeUsuarios->findOneBy(['email' => $email]);

        if (is_null($usuario) || !$usuario->senhaEstaCorreta($senha)) {
            $this->defineMensagem('danger','E-mail ou senha inválidos');
            return new Response(302,['Location:' => '/login']);
        }

        $_SESSION['logado'] = true;
        return new Response(302,['Location:' => '/listar-cursos']);
    }
}

Esse é o seu :

<?php

namespace Alura\Cursos\Controller;

use Alura\Cursos\Entity\Usuario;
use Alura\Cursos\Helper\FlashMessageTrait;
use Doctrine\ORM\EntityManagerInterface;
use Nyholm\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

class RealizarLogin implements RequestHandlerInterface
{
    use FlashMessageTrait;

    /**
     * @var \Doctrine\Common\Persistence\ObjectRepository
     */
    private $repositorioDeUsuarios;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->repositorioDeUsuarios = $entityManager
            ->getRepository(Usuario::class);
    }

    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $email = filter_var(
            $request->getParsedBody()['email'],
            FILTER_VALIDATE_EMAIL
        );

        $redirecionamentoLogin = new Response(302, ['Location' => '/login']);
        if (is_null($email) || $email === false) {
            $this->defineMensagem(
                'danger',
                'O e-mail digitado não é um e-mail válido.'
            );

            return $redirecionamentoLogin;
        }

        $senha = filter_input(
            INPUT_POST,
            'senha',
            FILTER_SANITIZE_STRING
        );

        /** @var Usuario $usuario */
        $usuario = $this->repositorioDeUsuarios
            ->findOneBy(['email' => $email]);

        if (is_null($usuario) || !$usuario->senhaEstaCorreta($senha)) {
            $this->defineMensagem('danger', 'E-mail ou senha inválidos');

            return $redirecionamentoLogin;
        }

        $_SESSION['logado'] = true;

        return new Response(302, ['Location' => '/listar-cursos']);
    }
}

Paulo, batendo o olho parece correto. Realmente me esqueci de trocar o INPUT_POST pelo request, aparentemente, mas nada que afete o funcionamento...

Você pode debugar seu código pra entender em que momento o erro tá sendo gerado. Talvez os campos no HTML estejam com outro nome, ou talvez eu deixei algo passar olhando agora mesmo...

O ideal realmente é debugar pra entender exatamente o que tá acontecendo.

Vinicius, A diferença entre o meu e o seu está em :

Vinicius, a diferença entre o meu e o seu, está em :

Meu :

$queryString = $request->getQueryParams();
        var_dump($queryString);
        $email = filter_var($queryString['email'],FILTER_VALIDATE_EMAIL);

Seu :

$email = filter_var(
            $request->getParsedBody()['email'],
            FILTER_VALIDATE_EMAIL
        );

Vc usou getParsedBody e eu usei getQueryParams, Qual a diferença entre estes ? Pq o seu funciona e o meu não kkkkkkkkkkkkk

solução!

Eu não tinha visto. Paulo, a diferença é exatamente o que o nome diz.

Um busca o corpo da requisição, o outro busca os parâmetros da URL.

Pra entender melhor o que é o corpo da requisição, confere o curso de HTTP. :-)