2010-07-25 6 views
2

PHP와 Smarty를 사용하고 있습니다. 나는 간단한 응용 프로그램이 있습니다 사용자가 로그인되어있는 경우Smarty가있는 PHP의 사용자 유효성 검사 패턴

  • 페이지 헤더를
  • 확인을 보여줍니다 - 로그인 한 경우> 다음 명확한 세션
  • -을 사용자가 로그 아웃하고자하는 경우> 세션
  • 확인을 확인 메뉴를 보여줍니다.
  • 로그인하지 않은 경우
  • , 다음 아이디/암호를 사용자 도전 -
  • 페이지 바닥 글을 표시합니다> 설정 세션

지금 내가 헤더에 다음 사항을 추가하려면 :

  • 이름하여 로그인 한 경우

에 로그인하지 않은 경우

  • 이 필요한 것으로 보인다하려면 문자열을 "로그인" 내 PrintHeader 함수의 배치가 복잡해집니다. 사용자가 로그인/방금 로그 아웃했음을 알기 전까지는 더하기 헤더가 사용자/비밀번호 확인에 앞서야한다는 것을 알기 전까지 헤더를 인쇄 할 수 없습니다.

    여기에서 어떤 방법을 사용할 수 있습니까? "로그인하지 않은"헤더를 버퍼링 한 다음 필요할 경우 "기록 된 경우 헤더"로 바꿀 수 있습니까?

    SmartyApp::PrintHeader(); 
    
    Application->IsLoggedIn() 
    Application->DoesUserWantsToLogOut() 
    Application->IfNotLoggedInThenShowChallengeToUser() 
    Application->IfLoggedInThenShowFullMenu() 
    
    SmartyApp::PrintFooter(); 
    
  • +2

    처음에는 극복해야 할 작은 건축 융기가있는 것 같습니다. 이러한 논리 (사용자가 로그인 한 경우 등)는 템플릿에서 수행하면 안됩니다. 하지만 일부 컨트롤러 나 다른 비즈니스 논리 장소에서. 그 중 하나를 사용하고 있습니까? 프레임 워크를 사용하고 있습니까? 또는 당신 자신? 그렇다면 어쩌면 그 정보를 알려줄 수 있습니까? – berkes

    +0

    나만의 즉흥적 템플릿을 사용하고 있습니다. 몇 가지 유틸리티를 사용하여 클래스를 확장하는 각 페이지마다 얇은 최상위 컨트롤러가 있습니다. 각 컨트롤러는 비즈니스 로직을 수행하는 해당 모델 클래스를 인스턴스화합니다. 나는 Smarty를 사용하여 페이지를 렌더링합니다. 인쇄 논리가 어디로 가야할지 모르겠습니다. –

    답변

    0

    더 편리한 패턴은 각 가능한 결과에 대해 여러 템플릿을 유지하는 대신 템플릿 자체 내에 조건을 통합하는 것입니다. 예 :

    +0

    thats OK하지만 코드에 500 줄까지 기록되는지는 알 수 없습니다. 즉, "로그온"화면 바로 전에 사용자 유효성 검사 코드에 "출력 헤더"를 묻어 야합니다. –

    +0

    "로그인하지 않았습니다"헤더를 앞에 출력 한 다음 적절한 버전이 아닌 경우 지울 수 있습니까? ? –

    +1

    @TMP - 건축 문제의 해결 방법 인 것 같습니다. 모든 비즈니스 로직이 모든 출력에 앞서 실행되도록 솔루션을 수정해야합니다. – karim79

    0

    Smarty의 요점은 페이지의 디자인과 로직을 분리한다는 것입니다. 귀하의 경우 귀하의 논리는 이제 귀하의 디자인을 제어하고 Smarty가하도록 설계된 것이 아닙니다. 응용 프로그램 내에서 디자인을 제어하려면 Smarty를 사용하지 않아야합니다.

    스마티를 사용하려면 PrintHeader()PrintFooter()을 제거한 다음 Smarty 템플릿 안에 디스플레이와 관련된 디자인을 넣으십시오.

    아마도 패턴을 따르는 가장 쉬운 방법은 응용 프로그램이 적절한 템플릿을 가져 와서 적절한 변수를 할당하는 것입니다. 그런 다음 각 스마티 템플릿

    Application->IsLoggedIn(); // assign some login variables 
    Application->DoesUserWantsToLogOut(); // probably redirect and logout and never get to display 
    Application->IfNotLoggedInThenShowChallengeToUser(); // template would be the login template 
    Application->IfLoggedInThenShowFullMenu(); // fetch and assign a menu to the template 
    
    $_smarty->display(Application->template); 
    

    : 머리글과 바닥 글에 변수를 할당 할 수

    {include file=header.tpl } 
    HTML for each template 
    {include file=footer.tpl } 
    

    참고 그냥 당신이하고자 일반 템플릿과 같이 포함되어 있습니다. 따라서 헤더에 변수 {$username}이있는 경우 응용 프로그램 메뉴 출력에 지정하면 설정됩니다. 이 같은 것은 아마 당신이 원하는 것일 것입니다 : {if $username} {$username} {else} Log-In{/if}

    마찬가지로 나는 의견을 다소 다르게 디자인 할 것입니다. 나는 OO가 "if 문을 사용하지 말라"는 것을 의미하지 않는다고 생각한다.아래에있는 것과 같은 것이 더 명확하다고 생각합니다.

    $app = new App(); 
    if($app->loggedIn()) { 
        if($app->logout()) { 
          $app->redirect('goodbye.php'); 
        } 
        $smarty->assign('menu', $app->menu()); 
        $smarty->assign('user', $app->user()); 
        $template = 'main.tpl'; 
    } 
    else { 
        $template = 'login.tpl'; 
    } 
    
    $smarty->display($template); 
    

    멋진 템플릿은 위의 예와 동일하게 보입니다.

    관련 문제