Manipulando Cookies no Laravel

Aprenderemos nesse artigo como criar, verificar existência, obter valor e deletar.

 Escrevendo testes automatizados com PHPUnit

Cookies é um mecanismo para salvar informações no navegador de Internet do cliente, possibilitando a consulta e manipulação sem maiores dificuldades. É através dos cookies que é possível saber as preferências dos usuários, como não exibir um modal, alterar para o modo escuro, entre outros.

Existem inúmeras formas de trabalhar com Cookies no Laravel, nesse artigo nós vamos utilizar a classe Illuminate\Support\Facades\Cookie com seus respectivos métodos de manipulação.

Removendo criptografia de Cookies

Antes de partirmos para a prática, é importante que você saiba que os valores dos cookies ficam armazenados de forma criptografada, impossibilitando a leitura do seu valor por nós humanos e outras aplicações.

Caso você necessite obter os valores em sua forma real, como, por exemplo, obter os valores no Javascript para a sua manipulação, será necessário inserir o nome do cookie a uma lista de exclusão.

Acessando o Middleware EncryptCookies que está disponível em app\Http\Middleware\EncryptCookies.php, insira o nome do cookie no array $except, conforme o exemplo abaixo.

protected $except = [
     'cookie_name'
];

Na imagem abaixo você pode observar que temos dois cookies, sendo um chamado de other_cookie com seu valor criptografado, enquanto o outro, chamado de cookie_name, apresenta seu valor real, pois está na lista do Middleware.

Manipulando cookies

Vamos programar alguns exemplos, um para criar, obter seu valor, verificar se o registro existe e outro para deletar. Ainda no nosso exemplo, criamos uma controladora chamada de CookieController e três rotas como pode ser observado no código abaixo.

Route::prefix('cookie')->group(function () {
    Route::get('set',    [CookieController::class, '_setCookie']);
    Route::get('get',    [CookieController::class, '_getCookie']);
    Route::get('delete', [CookieController::class, '_deleteCookie']);
});

Acessamos as seguintes rotas para cada ação:

  • http://127.0.0.1:8000/cookie/set
  • http://127.0.0.1:8000/cookie/get
  • http://127.0.0.1:8000/cookie/delete

Antes de criar nossos métodos, é importante definir o use do namespace correto, conforme o código a seguir.

use Illuminate\Support\Facades\Cookie;

Para fins didáticos e evitar conflitos, nomeamos nossos métodos com o underline antes, mas esse não é um requisito para a utilização da classe Cookie. Veja nosso exemplo completo abaixo.

    /**
     * Cria um novo Cookie
     *
     * @return void
     */
    public function _setCookie()
    {
        Cookie::queue('cookie_name', 'My Laravel Cookie', 3);

        Cookie::queue('other_cookie', 'Other Laravel Cookie', 3);
    }

    /**
     * Verifica se um Cookie existe e retorna o seu valor
     *
     * @return void
     */
    public function _getCookie()
    {
        if (Cookie::has('cookie_name')) {

            $cookieValue = Cookie::get('cookie_name');

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

        return response()->json('Cookie not exists');
    }

    /**
     * Remove um Cookie
     *
     * @return void
     */
    public function _deleteCookie()
    {
        Cookie::queue(Cookie::forget('cookie_name'));
    }

Vamos entender os quatros métodos da classe Cookie utilizados no exemplo acima.

  • queue - passamos a chave de acesso, seu valor e o tempo de expiração em minutos. Veja que criamos dois cookies, um deles está assinado na lista de exceção e o outro não, conforme explicado no início do artigo;
  • has - informamos o nome da chave de acesso, caso o cookie exista, então retorna o valor true, do contrário, retorna false;
  • get - informamos o nome da chave de acesso, caso o cookie exista, então retorna o seu valor, do contrário, retorna null; 
  • forget - para expirar um cookie, passamos o queue como parâmetro para esse método.

Você pode obter mais exemplos de métodos em https://laravel.com/api/8.x/Illuminate/Cookie/CookieJar.html.

Finalizamos por aqui, até a próxima.