PRG 패턴 및 플래싱을 사용한 세션 처리

WBOY
풀어 주다: 2024-07-18 21:46:21
원래의
433명이 탐색했습니다.

Session Handling with the PRG pattern and Flashing

이전 프로젝트에서는 유효성 검사에 실패했을 때 POST 요청에서 직접 뷰를 반환하는 것이 최선의 접근 방식이 아니었습니다.

문제

사용자가 잘못된 데이터가 포함된 로그인 양식을 제출하면 양식에 오류 메시지가 표시되고 사용자가 로그인 페이지로 리디렉션됩니다. 그러나 사용자가 페이지를 새로 고치거나 다른 곳으로 이동했다가 로그인 페이지로 돌아오면 동일한 오류 메시지가 계속 나타납니다.

해결책

이 문제를 해결하기 위해 세션을 사용하여 오류를 저장하고 PRG 패턴을 구현할 수 있습니다. $_SESSION 슈퍼전역 변수에 오류를 저장하고 create.php의 오류 문을 다음과 같이 업데이트할 수 있습니다.

$_SESSION['errors'] = $form->errors();
view('session/create.view.php', [ 'errors' => $_SESSION['errors'] ?? [] ]);
로그인 후 복사

그러나 이러한 변경에도 불구하고 문제는 여전히 지속됩니다. 이 문제를 해결하려면 return 문을 다음과 같이 변경해야 합니다.

return redirect ('/login');

로그인 후 복사


ㅋㅋㅋ
오류가 발생하면 사용자를 로그인 페이지로 이동하지만 사용자 w에게는 오류를 표시하지 않습니다
그런 다음 $_SESSION 슈퍼전역 변수를 플래시하여 잠시 후 세션을 삭제합니다.

$_SESSION['_flashed']['errors'] = $form->errors();
로그인 후 복사

이제 문제가 해결되었음을 알 수 있지만 이 코드를 리팩토링하려면 클래스에 PRG 메서드를 추가해야 합니다.

세션 클래스(PRG 패턴)

리팩토링을 위해 사용자 세션을 관리하는 세션 클래스가 포함된 Core/Session.php라는 새 파일을 생성합니다.

<?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. 플래시 방법은 세션 플래싱에 사용되는 $_SESSION['_flash'] 배열에 데이터를 저장합니다.
  2. get 메소드는 $_SESSION['_flash']에 플래시된 데이터가 있는지 확인하고 이를 반환합니다. 그렇지 않은 경우 일반 세션 데이터 또는 기본값을 반환합니다.
  3. unflash 메소드는 플래시된 데이터의 설정을 해제하여 다음 요청에만 사용할 수 있도록 합니다.
  4. PRG 패턴은 put 메소드를 사용하여 세션에 데이터를 저장하고 리디렉션(예: return redirect('/login'); 사용)한 후 get 메소드를 사용하여 다음 요청에서 데이터를 검색하는 방식으로 구현됩니다.

이 세션 클래스를 사용하면 PRG 패턴과 세션 플래싱을 구현하여 사용자 세션을 관리하고 중복 양식 제출과 원치 않는 오류 메시지 지속을 방지할 수 있습니다.

메소드 있음

이 파일에서 has 메소드는 세션에 키가 존재하는지 여부를 나타내는 부울 값을 반환합니다.

. 

public static function has($key) {
    return (bool) static::get($key);
}
로그인 후 복사

로그아웃 기능 리팩토링

function.php 파일에서 세션 클래스를 사용하도록 로그아웃 함수를 리팩토링합니다.

Session::destroy();
로그인 후 복사

get 메소드 리팩토링

이미 프로젝트가 잘 진행되고 있기 때문이죠. 하지만 코드를 단일 명령문으로 통합하려면 Core/Session.php에서 get 메소드를 리팩터링해야 합니다.

public static function get($key, $default = null) {
    return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default;
}
로그인 후 복사

오늘 프로젝트에서는 코드의 모양을 개선하고, 이해하기 쉽게 만들고, 코드 성능을 높이기 위해 많은 리팩토링이 수행되었습니다.

명확히 이해되셨으면 좋겠습니다!.

위 내용은 PRG 패턴 및 플래싱을 사용한 세션 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿