Jak ustawić sesję w Codeigniter na przykładzie

Zarządzanie sesjami CodeIgniter

Jeśli już wcześniej tworzyłeś aplikacje desktopowe, zapewne wiesz, że możesz zdefiniować zmienną globalną, przypisać jej wartość i używać jej przez cały cykl życia aplikacji otwierając i zamykając więcej niż jedną (1) a każde żądanie będzie miało dostęp zmienna globalna.

Inaczej mówiąc, stan aplikacji zostaje zachowany. Oznacza to, że jeśli po zalogowaniu ustawisz nazwę firmy na zmienną globalną, to nawet po zamknięciu formularza logowania stan nazwy firmy zostanie zachowany.

HTTP działa nieco inaczej niż w powyższym scenariuszu, który właśnie opisaliśmy. Jest bezpaństwowy. Oznacza to, że wszystko, co zrobisz w jednej prośbie, nie będzie kontynuowane w następnej prośbie. T

o obejść ten problem. Mamy dwa (2) rozwiązania w PHP. Możemy pracować z plikami cookie, które są małymi plikami umieszczanymi na komputerze użytkownika, lub pracować z sesjami, które są podobne do plików cookie, ale zamiast tego są przechowywane na serwerze i mają większą pojemność niż pliki cookie.

Kiedy stosować sesje?

Sesje są zazwyczaj przydatne, gdy chcesz poznać działania użytkownika na poszczególnych stronach. Na przykład, powiedzmy, że masz chroniony obszar na stronie internetowej. Użytkownicy nie muszą się logować na każdej stronie. Możesz pozwolić użytkownikowi zalogować się raz i zapisać jego dane w zmiennej sesji, a następnie ponownie wykorzystać te same dane w kolejnych żądaniach. Inne przypadki użycia obejmują pracę nad systemem zakupów, w którym użytkownik musi dodać elementy do koszyka.

Alternatywnie CodeIgniter wykorzystuje również sesje, aby udostępnić dane tylko raz przy następnym żądaniu. Jest to przydatne, jeśli edytowałeś i aktualizowałeś rekord w bazie danych, a chcesz zwrócić użytkownikowi informację zwrotną, gdy zostanie on przekierowany na inną stronę.

Wysyłanie wiadomości Flash na inne strony z sesjami CI

W tej sekcji dowiesz się o wysyłaniu wiadomości flash na inne strony przy użyciu biblioteki sesji CodeIgniter

Utwórz nowy plik SessionController w

application/controllers/SessionController.php

Dodaj następujący kod

<?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'));
    }
}

TUTAJ,

  • class SessionController rozszerza CI_Controller {…} definiuje klasę SessionController i rozszerza klasę kontrolera nadrzędnego.
  • funkcja publiczna __construct() {…} definiuje metodę konstruktora, która inicjuje klasę nadrzędną i ładuje pomocnika adresu URL oraz bibliotekę sesji.
  • funkcja publiczna indeks() {…} definiuje metodę indeksu sesji, która ładuje widok indeksu sesji.
  • funkcja publiczna flash_message(){…} definiuje metodę wiadomości flash, która ustawia dane flash, a następnie przekierowuje do trasy flash_index

Stwórzmy teraz widok, który wyświetli wartość danych sesji.

Utwórz nową sesję katalogu w aplikacji/widokach

Utwórz nowy plik indeks.php w aplikacji/views/sessions

Dodaj następujący kod

<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>

TUTAJ,

session->userdata('msg');?> pobiera wartość danych sesji za pomocą klucza msg i wyświetla ją w przeglądarce.

Utwórzmy teraz trasy dla naszej metody flashowania sesji

Otwórz aplikację/config/routes.php

Dodaj następujące wiersze

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

Uruchommy teraz wbudowany serwer dla PHP i przetestuj nasze wiadomości flash

Otwórz terminal

Uruchom następujące polecenie

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

TUTAJ,

Powyższe polecenie powoduje przejście do katalogu z kodem aplikacji i uruchomienie wbudowanego serwera na porcie 3000.

Uwaga: ścieżka aplikacji musi odpowiadać ścieżce, z której pobrałeś CodeIgniter i możesz użyć dowolnego numeru portu, który jest wolny na twoim komputerze. Nie jest konieczne używanie portu 3000.

Wczytaj następujący adres URL do swojej przeglądarki internetowej: http://localhost:3000/flash_message

Zostaniesz przekierowany do następującego adresu URL i otrzymasz następujące wyniki: http://localhost:3000/flash_index

Wysyłanie wiadomości Flash na inne strony

Kliknij przycisk odświeżania przeglądarki internetowej lub naciśnij klawisz F5

Teraz otrzymasz następujące wyniki

Wysyłanie wiadomości Flash na inne strony

Przechowywanie danych użytkownika w sesjach CI

Spójrzmy teraz na nieco bardziej zaawansowany przykład. Dla uproszczenia będziemy symulować uwierzytelnianie użytkownika, a nie realną realizację polegającą na weryfikacji zapisu użytkownika w bazie i podanego hasła.

Zacznijmy od tras

Otwórz Routes.php znajdujący się w application/config

Dodaj następujące trasy

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

TUTAJ,

  • $route['login'] = 'kontroler sesji/logowanie'; definiuje trasę wyświetlającą formularz logowania
  • $route['authenticate'] = 'kontroler sesji/uwierzytelnij'; definiuje trasę symulującą pomyślne logowanie użytkownika i ustawia dane logowania do sesji.
  • $route['ustawienia'] = 'kontroler sesji/ustawienia'; definiuje chronioną stronę, która powinna być dostępna tylko dla zalogowanych użytkowników
  • $route['pulpit nawigacyjny'] = 'kontroler sesji/panel kontrolny'; definiuje chronioną stronę, która powinna być dostępna tylko dla zalogowanych użytkowników.
  • $route['logout'] = 'kontroler sesji/wylogowanie'; wylogowuje użytkownika niszcząc dane sesji

Zaktualizujmy teraz SessionController

Otwórz aplikację/kontrolery/SessionController.php

Dodaj następujące metody

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'));
    }

TUTAJ,

  • funkcja publiczna check_auth($page) {…} definiuje metodę sprawdzającą, czy użytkownik jest zalogowany i umożliwia dostęp do strony. Jeśli użytkownik nie jest zalogowany, zostaje przekierowany na stronę logowania za pomocą komunikatu flash.
  • funkcja publiczna login() {…} ładuje widok logowania znajdujący się w katalogu sesji.
  • public function authenticate() {…} ustawia dane użytkownika sesji dla kluczy signed_in i username. UWAGA: Nie weryfikujemy żadnych danych logowania w bazie danych. Po prostu zakładamy, że przesłane dane są poprawne i ustawiamy dane sesji.
  • funkcja public dashboard() {…} ładuje stronę dashboardu po wywołaniu $this->check_auth('dashboard'); co sprawdza, czy klucz sesji zalogowany jest ustawiony.
  • ustawienia funkcji publicznych() {…} ładuje stronę ustawień, która również jest chroniona
  • funkcja publiczna logout() {…} niszczy dane sesji i wylogowuje użytkownika. Metoda przekierowuje również na stronę logowania

Widoki sesji CodeIgniter

Utwórz następujące widoki w aplikacji/widoki/sesje

  • deska rozdzielcza.php
  • login.php
  • settings.php

Dodaj następujący kod do 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>

TUTAJ,

session->userdata('username');?> wyświetla nazwę użytkownika, którą ustawiliśmy w metodzie uwierzytelniania

Dodaj następujący kod do 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>

TUTAJ,

Formularz logowania zostanie przesłany w celu uwierzytelnienia trasy.

Dodaj następujący kod do 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>

To tyle, jeśli chodzi o nasze poglądy. Przetestujmy teraz naszą aplikację.

W tym samouczku używamy wbudowanego serwera WWW PHP, ale możesz użyć dowolnego serwera WWW obsługującego PHP.

Otwórz terminal

Uruchom następujące polecenie

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

TUTAJ,

Powyższe polecenie powoduje przejście do katalogu z kodem aplikacji i uruchomienie wbudowanego serwera na porcie 3000.

Uwaga: ścieżka aplikacji musi odpowiadać ścieżce, z której pobrałeś CodeIgniter i możesz użyć dowolnego numeru portu, który jest wolny na twoim komputerze. Nie jest konieczne używanie portu 3000.

Otwórz następujący adres URL w swojej przeglądarce internetowej: http://localhost:3000/dashboard

zostaniesz przekierowany na następującą stronę

Widoki sesji CodeIgniter

Kliknij przycisk Zaloguj

Zobaczysz następujące wyniki

Widoki sesji CodeIgniter

Po zalogowaniu możemy już zobaczyć dane sesji.

Podsumowanie

W tym samouczku poznałeś podstawy biblioteki sesyjnej CodeIgniter i nauczyłeś się, jak jej używać do przechowywania danych tymczasowych w postaci wiadomości flash oraz jak przechowywać bardziej trwałe dane, tj. dane logowania użytkownika.