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
Kliknij przycisk odświeżania przeglądarki internetowej lub naciśnij klawisz F5
Teraz otrzymasz następujące wyniki
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ę
Kliknij przycisk Zaloguj
Zobaczysz następujące wyniki
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.