2013-09-06 1 views
1

나는 프로 시저 방식으로 PHP를 프로그래밍하는 데 사용. OOP에 대해 더 많이 배우고 싶기 때문에 새로운 프로젝트를 위해 OOP 방식으로 PHP를 프로그래밍하기로 결정했습니다.PHP 클래스를 시작할 때 로그인 세션을 확인해야합니까?

어쨌든 사용자가 로그인해야하는 프로젝트가 있다고 가정 해 봅니다. login.php에서 사용자가 올바른 사용자 이름과 암호를 입력하면 index.php로 리디렉션되고 product 테이블에서 모든 제품을로드하고 index.php에 멋지게 표시합니다.

login.php

session_start(); 
... 
if (loggedCorrect($user, $password)) { 
    $_SESSION['loggedinuser'] = $user; 
    //redirect to index.php 
} 

index.php를

session_start(); 
if (isset($_SESSION['loggedinuser']) { 
     //select fields from products table and display them 
     ... 
} 
:

전에이이었다 내가 어떻게했는지, login.php에서 나는 다음과 같은 코드가 있습니다

그래서 OOP에서는 다음과 같이됩니다 :

login.php

session_start(); 
$user = new User($user, $password); 
if ($user->hasCorrectLogin()) { 
    $_SESSION['loggedinuser'] = $user->getUsername(); 
    //redirect to index.php 
} 

index.php를

session_start(); 
if (isset($_SESSION['loggedinuser']) { 
    $products = new Products(); 
    //display all products 
} 

제품 클래스

class Products { 
    private $productArray; 
    ... 
    __construct() { 
     //select all products from mySQL table then put every product in productArray 
    } 
... 
} 

내 질문은 다음과 같습니다

  1. 개체를 시작할 때 (내 경우 제품). 로그인 세션을 확인해야합니까? 그렇다면 __contruct 내부에서해야합니까? 또는 "클래스 제품"라인 이전에해야합니까?

  2. 나는 또한 x 분마다 실행될 cronjob.php가 있습니다. 실행 중에는 제품과 같은 일부 개체가 만들어지고 분석됩니다. 그래서 로그인 세션 확인이 필요하다면 cronjob이 세션을 지원하지 않기 때문에이 방법을 만드는 방법을 모르겠습니다.

+0

어떻게 'loggedCorrect'를 호출합니까? 나는 당신이'if ($ user-> hasCorrectLogin()) {'이 그들과 관련이 있다는 것을 알았습니까? –

+1

객체 지향 프로그래밍에서는 Separation of Concerns라는 원리를 알고 있어야합니다. 제품에 대한 클래스 모델이 사용자가 로그인했는지 여부를 신경 써야하는 이유는 무엇입니까 ?? 응용 프로그램에서 이미 로그인 한 세션을 확인한 다음 제품을 표시해야합니다. – Rottingham

+0

@ Fred-ii- loggedCorrect는 함수이며 기능은 $ user-> hasCorrectLogin()과 같습니다. 단지 하나는 절차 적 방법이고 다른 하나는 OOP입니다. – Josh

답변

1

빠른 답변 도메인 자체가 세션에 로그인에 의존해서는 안됩니다 객체

  1. 번호를 알려 주시기 바랍니다; 그러나 특정 사용자가 볼 수있는 제품 만 표시하는 등 특정 업무를 수행하려면 User 인스턴스가 필요할 수 있습니다.

  2. # 1로 인해 이제는 사소한 문제입니다.그 사용자가 데이터베이스와 상호 작용하는 방법과 자격 증명의 유효성을 검사하는 지식이 보일 것입니다,이 코드에서

    $user = new User($user, $password); 
    if ($user->hasCorrectLogin()) { 
    

    :

코드 검토

우선의 당신의 로그인 페이지 코드를 살펴 보자 . 그것은 하나의 클래스에 대해 너무 많은 책임이있는 것 같습니다.

해시 된 암호를 개체 내에 유지함으로써 암호 유효성 검사를 수행 할 수 있지만 암호를 한 번만 확인해야하므로 실제로 해당 필드를 유지할 필요가 없습니다. 이 작업을 수행하지 않는 또 다른 이유는 패스워드를 즉각적으로 강화할 필요가있을 때입니다. 증가하는 하드웨어 (예 : bcrypt를 사용할 때)를 확장하는 사이트 정책이 될 수 있습니다.

확실히 데이터베이스 상호 작용을 수행하면 안됩니다. 데이터베이스 상호 작용과 암호 확인을 User 클래스에서 분리하려면 인증 서비스 추가를 고려할 수 있습니다. 인증 서비스 내부

try { 
    $user = $authService->login($userName, $password); 
    $_SESSION['loggedinuser'] = $user; 
    // redirect to index.php 
} catch (InvalidLoginException $e) { 
    // oops, username or password invalid 
} 

, 당신은 (예를 들어 데이터 매퍼를 사용하여) 사용자 레코드를로드 할 추상화의 또 다른 레이어를 추가 할 수 있습니다.

세션에 사용자 이름 만 저장하는 대신 전체 User 객체를 저장할 수도 있습니다. 경우에 따라서는 불일치가 발생할 수 있지만 데이터베이스에 대한 왕복을 줄일 수 있습니다.

이제, 제품 개요 페이지를 관찰하자 : 나는 Products이 개체의 컬렉션을 설명하는 좋은 후보가 아니라고 말할 것 명명의 관점에서

$products = new Products(); 

. ProductList 또는 ProductCollection과 같은 이름이 더 좋습니다.

위의 인증과 마찬가지로 Products 클래스가 채워지는지 확실하지 않습니다. 그것은 어떤 스토리지에서 온, 그래서 제품의 목록을 제공합니다 저장소 소개하겠습니다한다 : 가장 간단한 시나리오에서

$productRepository = new ProductRepository($db); 
$products = $productRepository->getAll(); 

을, 저장소는 데이터베이스 인스턴스로 초기화됩니다; 필요한 경우 더 많은 수준의 추상화를 적용 할 수 있습니다.

+0

좋은 답변 ... – Zak

관련 문제