Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengendalian Sesi dengan corak PRG dan Berkelip

Pengendalian Sesi dengan corak PRG dan Berkelip

WBOY
WBOYasal
2024-07-18 21:46:21402semak imbas

Session Handling with the PRG pattern and Flashing

Dalam projek kami sebelum ini, mengembalikan paparan terus daripada permintaan POST apabila pengesahan gagal bukanlah pendekatan terbaik.

Masalahnya

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.

Penyelesaian

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

Kelas Sesi (corak PRG)

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']);
    }
}
  1. Kaedah denyar menyimpan data dalam tatasusunan $_SESSION['_flash'], yang digunakan untuk sesi berkelip.
  2. Kaedah get menyemak sama ada terdapat data yang dipancarkan dalam $_SESSION['_flash'] dan mengembalikannya. Jika tidak, ia mengembalikan data sesi biasa atau nilai lalai.
  3. Kaedah unflash menyahset data yang dipancarkan, menjadikannya tersedia hanya untuk permintaan seterusnya.
  4. Corak PRG dilaksanakan dengan menyimpan data dalam sesi menggunakan kaedah put, mengubah hala (cth., menggunakan return redirect('/login');), dan kemudian mendapatkan semula data dalam permintaan seterusnya menggunakan kaedah get.

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.

mempunyai Kaedah

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

Memfaktorkan semula Fungsi Log Keluar

Dalam fail function.php, kami memfaktorkan semula fungsi log keluar untuk menggunakan kelas Sesi:

Session::destroy();

Memfaktorkan semula Kaedah dapatkan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn