Como definir sessão no Codeigniter com exemplo

Gerenciamento de sessão CodeIgniter

Se você já desenvolveu aplicativos desktop antes disso, provavelmente sabe que pode definir uma variável global, atribuir um valor a ela e utilizá-la durante todo o ciclo de vida da aplicação abrindo e fechando mais de uma (1) e cada solicitação terá acesso a a variável global.

Em outras palavras, o estado do aplicativo é mantido. Isso quer dizer que se, ao fazer login, você definir o nome da empresa como uma variável global, mesmo depois de fechar o formulário de login, o estado do nome da empresa será preservado.

HTTP funciona um pouco diferente do cenário acima que acabamos de descrever. É apátrida. Isto é, digamos que tudo o que você faz em uma solicitação não persevera na próxima solicitação. T

o contornar esse problema. Temos duas (2) soluções em PHP. Podemos trabalhar com cookies que são pequenos arquivos colocados no computador do usuário ou trabalhar com sessões que são semelhantes aos cookies, mas que são armazenadas no servidor e têm maior capacidade que os cookies.

Quando usar sessões?

As sessões geralmente são úteis quando você deseja conhecer as atividades do usuário de uma página para outra. Por exemplo, digamos que você tenha uma área protegida no site. Os usuários não precisam fazer login em cada página. Você pode permitir que o usuário faça login uma vez e armazene seus detalhes em uma variável de sessão e reutilize os mesmos dados em solicitações futuras. Outros casos de uso incluem quando se trabalha em um sistema de compras e o usuário precisa adicionar itens ao carrinho de compras.

Alternativamente, o CodeIgniter também utiliza sessões para disponibilizar os dados apenas uma vez na próxima solicitação. Isso é útil, você pode editar e atualizar um registro de banco de dados e deseja retornar algum feedback ao usuário quando ele for redirecionado para outra página.

Envio de mensagens Flash para outras páginas com sessões de CI

Nesta seção, você aprenderá como enviar mensagens flash para outras páginas usando a biblioteca de sessões no CodeIgniter

Crie um novo arquivo SessionController em

application/controllers/SessionController.php

Adicione o seguinte código

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class SessionController extends CI_Controller {

    public function __construct() {
        parent:: __construct();

        $this->load->helper('url');
        $this->load->library('session');
    }

    public function index() {
        
        $this->load->view('sessions/index');
    }
    
    public function flash_message(){
        $this->session->set_flashdata('msg', 'Welcome to CodeIgniter Flash Messages');
        redirect(base_url('flash_index'));
    }
}

AQUI,

  • class SessionController estende CI_Controller {…} define a classe SessionController e estende a classe do controlador pai.
  • função pública __construct() {…} define o método construtor que inicializa a classe pai e carrega o auxiliar de url e a biblioteca de sessão.
  • public function index() {…} define o método de índice de sessão que carrega a visualização do índice de sessão.
  • função pública flash_message(){…} define o método de mensagem flash que define os dados flash e então redireciona para a rota flash_index

Vamos agora criar a visualização que exibirá o valor dos dados da sessão.

Crie uma nova sessão de diretório em application/views

Crie um novo arquivo index.php em application/views/sessions

Adicione o seguinte código

<html>
    <head>
        <title>Code Igniter Flash Session</title>
    </head>
    <body>
        <p>The session value of msg is <b> <?=$this->session->userdata('msg');?> </b></p>
    </body>
</html>

AQUI,

session->userdata('msg');?> recupera o valor dos dados da sessão com a chave de msg e os exibe no navegador.

Vamos agora criar as rotas para nosso método flash de sessão

Abra application/config/routes.php

Adicione as seguintes linhas

$route['flash_index'] = 'session controller';
$route['flash_message'] = 'session controller/flash_message';

Vamos agora iniciar o servidor integrado para PHP e teste nossas mensagens flash

Abra o terminal

Execute o seguinte comando

cd C:\Sites\ci-app
php -S localhost:3000

AQUI,

O comando acima navega até o diretório do código do aplicativo e inicia o servidor integrado na porta 3000.

Nota: o caminho do aplicativo deve corresponder ao caminho onde você baixou o CodeIgniter, e você pode usar qualquer número de porta que esteja livre em seu computador. Não é necessário usar a porta 3000.

Carregue o seguinte URL em seu navegador: http://localhost:3000/flash_message

Você será redirecionado para o seguinte URL e obterá os seguintes resultados: http://localhost:3000/flash_index

Envio de mensagens Flash para outras páginas

Clique no botão atualizar do seu navegador ou pressione F5

Agora você obterá os seguintes resultados

Envio de mensagens Flash para outras páginas

Armazenando dados do usuário em sessões de CI

Vejamos agora um exemplo um pouco mais avançado. Para simplificar, simularemos a autenticação do usuário e não faremos a implementação real da verificação do cadastro do usuário no banco de dados e da senha enviada.

Vamos começar com as rotas

Abra rotas.php localizado em application/config

Adicione as seguintes rotas

$route['login'] = 'sessioncontroller/login';
$route['authenticate'] = 'sessioncontroller/authenticate';
$route['settings'] = 'sessioncontroller/settings';
$route['dashboard'] = 'sessioncontroller/dashboard';
$route['logout'] = 'sessioncontroller/logout';

AQUI,

  • $route['login'] = 'sessioncontroller/login'; define a rota que exibe o formulário de login
  • $route['authenticate'] = 'sessioncontroller/autenticar'; define a rota que simula o login bem-sucedido do usuário e define os dados de login da sessão.
  • $route['settings'] = 'sessioncontroller/settings'; define uma página protegida que só deve ser acessível a usuários logados
  • $route['dashboard'] = 'sessioncontroller/dashboard'; define uma página protegida que só deve ser acessível a usuários logados.
  • $route['logout'] = 'sessioncontroller/logout'; desconecta o usuário destruindo os dados da sessão

Vamos agora atualizar o SessionController

Abra application/controllers/SessionController.php

Adicione os seguintes métodos

public function check_auth($page) {
        if (!$this->session->userdata('logged_in')) {
            $this->session->set_flashdata('msg', "You need to be logged in to access the $page page.");
            redirect('login');
        }
    }

    public function login() {
        $this->load->view('sessions/login');
    }

    public function authenticate() {
        $this->session->set_userdata('username', 'John Doe');
        $this->session->set_userdata('logged_in', TRUE);
        redirect(base_url('dashboard'));
    }

    public function dashboard() {
        $this->check_auth('dashboard');
        $this->load->view('sessions/dashboard');
    }

    public function settings() {
        $this->check_auth('settings');
        $this->load->view('sessions/settings');
    }

    public function logout() {
        $this->session->unset_userdata('username');
        $this->session->unset_userdata('logged_in');
        redirect(base_url('login'));
    }

AQUI,

  • public function check_auth($page) {…} define o método que verifica se o usuário está logado e permite acesso à página. Se um usuário não estiver conectado, ele será redirecionado para a página de login com uma mensagem flash.
  • public function login() {…} carrega a visualização de login localizada no diretório de sessões.
  • public function authenticate() {…} define os dados do usuário da sessão para as chaves logado_in e nome de usuário. NOTA: Não estamos verificando nenhum detalhe de login no banco de dados. Estamos simplesmente assumindo que os detalhes enviados estão corretos e definimos os dados da sessão.
  • public function dashboard() {…} carrega a página do painel após chamar $this->check_auth('dashboard'); que verifica se a chave de sessão logada_in está definida.
  • public function settings() {…} carrega a página de configurações que também está protegida
  • public function logout() {…} destrói os dados da sessão e desconecta o usuário. O método também redireciona para a página de login

Visualizações de sessão do CodeIgniter

Crie as seguintes visualizações em application/views/sessions

  • painel.php
  • login.php
  • settings.php

Adicione o seguinte código ao dashboard.php

<!DOCTYPE html>
<html>
    <head>
        <title>Dashboard</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css">
    </head>
    <body>
        <div class="container">
            <div class="column">
                <nav class="navbar" role="navigation" aria-label="main navigation">
                    <div id="navbarBasicExample" class="navbar-menu">
                        <div class="navbar-start">
                            <a href="<?= site_url('dashboard')?>" class="navbar-item is-active">Dashboard</a>
                            <a href="<?= site_url('settings')?>" class="navbar-item">Settings</a>
                        </div>

                        <div class="navbar-end">
                            <div class="navbar-item has-dropdown is-hoverable">
                                <a class="navbar-link"><?=$this->session->userdata('username');?></a>

                                <div class="navbar-dropdown">
                                    <a class="navbar-item">My Profile</a>
                                    <hr class="navbar-divider">
                                    <a class="navbar-item">Sign out</a>
                                </div>
                            </div>
                        </div>
                    </div>
                </nav>
                <h3>Welcome Page</h3>
            </div>
        </div>
    </body>
</html>

AQUI,

session->userdata('username');?> exibe o nome de usuário que definimos no método de autenticação

Adicione o seguinte código ao login.php

<!DOCTYPE html>
<html>
    <head>
        <title>Login</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css">
    </head>
    <body>
        <div class="container">
            <div class="column">
                <p><?=$this->session->userdata('msg');?></p>
                <form method="post" action="<?= site_url('authenticate')?>">
                    <div class="field">
                        <label class="label">Username</label>
                        <div class="control">
                            <input class="input" type="text" placeholder="Text input">
                        </div>
                    </div>
                    <div class="field">
                        <label class="label">Password</label>
                        <div class="control">
                            <input class="input" type="passport" placeholder="Text input">
                        </div>
                    </div>
                    <div class="field is-grouped">
                        <div class="control">
                            <button class="button is-success">Login</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </body>
</html>

AQUI,

O formulário de login é enviado para autenticar a rota.

Adicione o seguinte código em settings.php

<!DOCTYPE html>
<html>
    <head>
        <title>Settings</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css">
    </head>
    <body>
        <div class="container">
            <div class="column">
                <nav class="navbar" role="navigation" aria-label="main navigation">
                    <div id="navbarBasicExample" class="navbar-menu">
                        <div class="navbar-start">
                            <a href="<?= site_url('dashboard')?>" class="navbar-item">Dashboard</a>
                            <a href="<?= site_url('settings')?>" class="navbar-item">Settings</a>
                        </div>

                        <div class="navbar-end">
                            <div class="navbar-item has-dropdown is-hoverable">
                                <a class="navbar-link">Jim Jones</a>

                                <div class="navbar-dropdown">
                                    <a href="#" class="navbar-item">My Profile</a>
                                    <hr class="navbar-divider">
                                    <a href="<?= site_url('logout')?>" class="navbar-item">Sign out</a>
                                </div>
                            </div>
                        </div>
                    </div>
                </nav>
                <h3>Settings Page</h3>
            </div>
        </div>
    </body>
</html>

É isso para os nossos pontos de vista. Vamos agora testar nossa aplicação.

Neste tutorial, estamos usando o servidor web PHP integrado, mas você pode usar qualquer servidor web que suporte PHP.

Abra o terminal

Execute o seguinte comando

cd C:\Sites\ci-app
php -S localhost:3000

AQUI,

O comando acima navega até o diretório do código do aplicativo e inicia o servidor integrado na porta 3000.

Nota: o caminho do aplicativo deve corresponder ao caminho onde você baixou o CodeIgniter, e você pode usar qualquer número de porta que esteja livre em seu computador. Não é necessário usar a porta 3000.

Abra o seguinte URL em seu navegador: http://localhost:3000/dashboard

você será redirecionado para a seguinte página

Visualizações de sessão do CodeIgniter

Clique no botão Entrar

Você verá os seguintes resultados

Visualizações de sessão do CodeIgniter

Depois de fazer login, agora podemos ver os dados da sessão.

Resumo

Neste tutorial, você aprendeu o básico da biblioteca de sessões do CodeIgniter e aprendeu como usá-la para armazenar dados temporais como mensagens flash e como armazenar dados mais permanentes, ou seja, dados de login do usuário.