Dalam projek kami sebelum ini, mengembalikan paparan terus daripada permintaan POST apabila pengesahan gagal bukanlah pendekatan terbaik.
Apabila pengguna menyerahkan borang log masuk dengan data tidak sah, borang tersebut memaparkan mesej ralat dan mengubah hala pengguna ke halaman log masuk. Walau bagaimanapun, jika pengguna menyegarkan halaman atau menavigasi keluar dan kembali ke halaman log masuk, mesej ralat yang sama berterusan.
Untuk menyelesaikan isu ini, kami boleh menggunakan sesi untuk menyimpan ralat dan melaksanakan corak PRG. Kita boleh menyimpan ralat dalam pembolehubah superglobal $_SESSION dan mengemas kini kenyataan ralat dalam create.php sebagai:
$_SESSION['errors'] = $form->errors(); view('session/create.view.php', [ 'errors' => $_SESSION['errors'] ?? [] ]);
Tetapi walaupun dengan perubahan ini, masalah masih berterusan. Untuk menyelesaikannya, kita perlu menukar pernyataan pulangan sebagai :
return redirect ('/login');
l
Ia menggerakkan pengguna ke halaman log masuk jika berlaku sebarang ralat tetapi tidak menunjukkan ralat itu kepada pengguna w
Kami kemudian memancarkan pembolehubah superglobal $_SESSION untuk memusnahkan sesi selepas masa yang singkat:
$_SESSION['_flashed']['errors'] = $form->errors();
Sekarang anda dapat melihat bahawa masalah telah diselesaikan tetapi untuk memfaktorkan semula kod ini kita perlu menambah kaedah PRG dalam kelas
Untuk pemfaktoran semula, Kami mencipta fail baharu bernama Core/Session.php yang mengandungi kelas Sesi yang menguruskan sesi pengguna:
<?php namespace Core; class Session { public static function has($key) { return (bool) static::get($key); } public static function put($key, $value) { $_SESSION[$key] = $value; } public static function get($key, $default = null) { return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default; } public static function flash($key, $value) { $_SESSION['_flash'][$key] = $value; } public static function unflash() { unset($_SESSION['_flash']); } public static function flush() { $_SESSION = []; } public static function destroy() { static::flush(); session_destroy(); $params = session_get_cookie_params(); setcookie('PHPSESSID', '', time() - 3600, $params['path'], $params['domain'], $params['secure'], $params['httponly']); } }
Dengan menggunakan kelas Sesi ini, kami boleh melaksanakan corak PRG dan sesi berkelip untuk mengurus sesi pengguna dan menghalang penyerahan borang pendua dan mesej ralat yang tidak diingini berterusan.
Dalam fail ini, has method mengembalikan nilai Boolean yang menunjukkan sama ada kunci wujud dalam sesi:
. public static function has($key) { return (bool) static::get($key); }
Dalam fail function.php, kami memfaktorkan semula fungsi log keluar untuk menggunakan kelas Sesi:
Session::destroy();
Memandangkan projek itu sudah berfungsi dengan baik. Tetapi Kita perlu mendapatkan refactor kaedah get dalam Core/Session.php untuk menyatukan kod ke dalam satu pernyataan:
public static function get($key, $default = null) { return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default; }
Banyak pemfaktoran semula dilakukan dalam projek hari ini untuk menjadikannya lebih baik dari segi rupa, mudah difahami dan meningkatkan prestasi kod.
Saya harap anda telah memahaminya dengan jelas!.
Atas ialah kandungan terperinci Pengendalian Sesi dengan corak PRG dan Berkelip. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!