2011-01-04 2 views
3

내 웹 사이트에 대한 사용자 인증 시스템을 구현하는 중입니다. 저는 User 객체를 생성하고 그 객체를 PHP 세션 변수에 저장함으로써 사용자 정보를 유지하는 오픈 소스 라이브러리를 사용하고 있습니다. 이 정보를 저장하고 액세스하는 가장 좋은 방법입니까?개체를 사용하여 세션에서 사용자 정보 저장하기 대 일반 변수

$userObj = $_SESSION['userObject']; 
$userObj->userId; 

을 대신 어떻게 저장 일반적으로하는 것과 같은 사용자 ID를 액세스 :

나는 그것이 내가 처음에 액세스 할 객체를 생성하기 때문에 사용자 변수에 액세스하는 번거 로움을 조금 발견 사용자 ID :

$_SESSION['userId']; 

대상으로서 사용자 데이터의 무리를 저장하는 대신에 단지 개별 세션 변수로 저장하는 장점이 있는가?

ps - 라이브러리는 사용자 객체 (ID, 사용자 이름, 가입 날짜, 전자 메일, 최종 사용자 db 쿼리) 내에 몇 가지 변수를 저장하는 것으로 보이지만 실제로 저장되는 모든 정보는 신경 쓰지 않습니다. 내 세션. 나는 단지 정말로 사용자 ID와 사용자 이름을 유지하기를 원한다. 당신이 $_SESSION['user']->id$_SESSION['user_id']에 반대 할 수 있도록

+0

라이브러리 사용을 중지하려면이 개별 작업에 코드 줄을 저장하면되지만 장기적으로는 더 많은 코드가 손실 될 수 있습니다. –

+0

잘 라이브러리 사용을 중단하지 않을 것입니다. 아마도 내가 바꿀 부분을 수정했을 것입니다. 나는 또한 세션 변수에 객체를 저장하는 것에 대해 궁금하다는 것을 분명히 했어야했다. 저는 세션 변수를 밝게 유지해야하므로 다른 사람들이 말하는 것을 듣고 싶었습니다. – justinl

+1

'$ userObj = & $ _SESSION ['userObject '];' – RobertPitt

답변

2

내가 논리적으로 함께 하나의 키에 관련 데이터를 그룹화하는 것이 최선이라고 생각, 그것은 공통의 부모와 부부 관련 데이터, 그것은 또한 당신에게 키 이름에 관해서 더 호기심 공간을 제공, 당신이 당신처럼 키 이름 컨텍스트를 제공 할 필요가 없습니다 있도록, 속성 이름 상황이 할 수있는

user_* 키 나는 또한 여기에서 활동하기 시작하는 더 큰 개념이 있다고 생각

, user_*을 사용하면 키 이름이 user_* 인 모든 것이 사용자와 연결된다는 것을 알 수 있습니다. 이것은 객체 IMO를 구성하는 좋은 방법이 아닙니다. 그러나 user 키를 사용하고 연관된 데이터 을 모두 아래에 붙이면 직선보다 훨씬 깨끗한 최상위 레벨과 실제 중첩 된 데이터 계층 구조를 갖게됩니다.

+0

개체의 모든 사용자 데이터를 하나의 세션 키로 그룹화함으로써 라이브러리가하는 것처럼 사용자의 의견에 맞습니까? – justinl

+0

@justini 예, 전 그 방법론에 완전히 동의합니다. –

3

당신이 액세스 및 데이터의 저장을 처리하는 세션 래퍼 클래스를 생성하지 않는 이유는,이 많은 청소기 코드와 추상적 여기

은 예입니다 아주 쉽게 할 수있는 라인 아래 방법을 저장하는 변경, 그래서를 생성합니다 래퍼

abstract class Session 
{ 
    private static $_started = false; 
    private static $_driver; 

    pubic static function start($driver = "native", $site = "default") 
    { 
     if(self::$_started === false) 
     { 
      require_once "drivers/" . $driver . ".php"; 
      self::$_driver = new $driver($_site); 
     } 
    } 

    public static function set($key,$value) 
    { 
      self::$_driver->set($key,$value); 
    } 

    public static function get($key) 
    { 
      self::$_driver->get($key); 
    } 

    public static function remove($key) 
    { 
      self::$_driver->remove($key); 
    } 
} 

의 위의 유일한 간단하지만 당신은 아이디어를 얻을해야합니다, 당신은 또한 필요한 방법의 세트가 기본 드라이버 파일을 만들어야 할 것입니다, 그들은 그에 따라 세션 데이터를 저장해야합니다. 그래서 같은 세션 클래스를 사용

예 :

Session::start("native"); 

    /* 
     * Generic Code 
    */ 

Session::set("key","value (:"); 

하여 "사용자"를 가져 오는 당신은 간단한과 같이 다만 수 개체 :

Session::get("userObj")->id; 

훨씬 청소기 코드와 더 큰 범위의 문제를 생성 .

시간이 지나면 데이터베이스에 저장할 새 드라이버를 만든 다음 네이티브에서 데이터베이스로 드라이버를 변경하면됩니다.

참고 : 사용자 클래스가 범위에 오기 전에 코드가 세션로드로 구성되지 않은 경우 데이터베이스에 개체를 저장하는 것이 약간의 문제 일 수 있습니다. 그런 다음 세션에서 부분 개체를 가져 와서 기능이 부족할 수 있습니다 .

+1

잘못된 순서를 지키면 이상한 방식으로 중단되므로 포함 순서를 올바르게 가져 오는 것은 매우 중요합니다. – staticsan

+0

참으로 나는 그 문제에 대해 많은 조언을해주어야했다. ID를 저장하고 모든 요청에 ​​대해 데이터베이스에서 사용자를 끌어 오는 것이 더 좋다. 새로운 세션이 시작될 때까지 변경 사항이 지연되지 않는다. – RobertPitt

관련 문제