2010-07-09 5 views
0

나는 세션을 많이 사용하는 프로젝트에서 일한다. 우리는 db handler (Zend의 표준 핸들러)를 가지고 있으며, 현재 preDispatchLoop을위한 플러그인에서이 초기화 (db handler + session start)를 가지고 있습니다. 이전에는 preDispatch에 있었지만 각 작업 ('전달 된'작업에 포함 된 작업 포함) 때문에 문제가 발생했습니다.젠드 프레임 워크 - 라우터가 액세스해야 할 때 세션 초기화 위치

내 문제는 내가 국제화 작업을 시작했고 라우터를 사용하여 검색을 시작했기 때문입니다. URI의 언어 :/language/controller/action 형식 사용). 라우터가 세션을 사용하여 언어를 읽고 저장하려고합니다. 하지만 라우터가 처음에 나온 다음 (사전/사후) 발송자 정보를 알 수 있습니다.

그래서 질문은 : 세션 초기화를 부트 스트랩으로 이동하지 않는 이유는 무엇입니까? 전에 거기 있었기 때문에 그것은 db (세션이 db를 사용한다는 것을 기억해야합니다)가 오류를 방지하기 위해 액세스 할 수 있는지 테스트해야하기 때문에 이동해야했습니다. 그리고 오류가 있다면 단순히 리디렉션 (request-> setController/setAction 오류). 내가 세션 초기화 코드를 부트 스트래핑으로 옮기면 DB에 액세스 할 수없는 경우 리디렉션을 만들 수 없습니다.

다른 질문을 읽고 많은 사람들이 부트 스트래핑에서 요청 개체에 액세스하도록 요청했습니다. 그러나 그들은 모두 이렇게 말합니다. 하지만이 경우 어떻게해야합니까? 내 마지막 옵션은 세션 초기화를 부트 스트랩으로 되돌려 놓는 것이고, 실패하면 수동으로 헤더를 보내고 뷰를 읽지 만 오류 코드는 무시 무시한 해킹입니다.

내 생각에 세션을 일찍 사용해서는 안된다는 것입니다. 요청 된 컨트롤러/동작을 아직 완전히 알지 못하기 때문에 부트 스트랩에서 호출해서는 안됩니다. 나는 언어를 얻으려면 쿠키 (수동)에 의존하고 거기에서 (URI뿐만 아니라) 그것을 얻을 수 있다고 생각한다. 그리고 결국 언젠가 세션 정보가 부트 스트래핑에서 사용되어야한다면 나는 전역 변수를 사용할 것입니다.

당신은 어떻게 생각하십니까? 내가 응용 프로그램을 제어하는 ​​방식에 오류가 있습니까?

몇 가지 질문을 볼 :

Zend Framework: Getting request object in bootstrap

Best way to deal with session handling in Zend Framework

(젠드 버전 1.9.6, 응용 프로그램이나 부트 스트랩 사용하지 않는) 난에 세션 초기화 및 DB 연결을 움직일 것입니다

+0

왜 DB를 부팅 한 다음 세션을 부트 스트랩 할 수 있는지 명확하지 않습니다. db에 액세스 할 수없는 경우 리디렉션하기 위해 세션을 왜 필요로합니까? –

+0

내가 오류가 있으면 리디렉션 할 수 없기 때문입니다. 부트 스트래핑에서 요청 개체에 직접 액세스 할 수 없지만 가져올 수는 없지만 (그게 내가 읽은 것입니다). 그래서 나는 에러시 리디렉션 할 수 있도록 db (및 세션) 초기화 코드를 플러그인으로 옮겼습니다. 하지만이 플러그 인은 라우터 뒤에 만 호출됩니다 (http://framework.zend.com/manual/en/zend.controller.basics.html의 흐름 참조). 오류가 발생하면 리디렉션하기 위해 세션이 필요하지 않습니다. 결국 내가 한 것은 단순히 부트 스트랩에서 세션 정보를 사용하는 것을 중단하는 것이 었습니다. –

답변

1

을 부트 스트랩.
부트 스트랩 (bootstrapp) 동안 데이터베이스에 연결할 수없는 경우이 오류는 저수준 오류로 간주됩니다. 프로덕션 환경에서는 예외가 발생하지 않습니다.
부트 스트랩 프로세스를 try catch 블록으로 감싸서 오류 페이지를 출력하면됩니다.

// in your index.php 
try { 
    $application = new Zend_Application(
     APPLICATION_ENV, 
     APPLICATION_PATH . '/configs/application.ini' 
    ); 

    $application->bootstrap() 
       ->run(); 

} catch (Exception $e) { 
    header('Content-type: text/html; charset=utf-8'); 
    header('HTTP/1.1 503 Service Unavailable'); 
    header("Retry-After: 3600"); 
    // Output some error page. 
    echo "<html><head><title>System Error</title></head><body>...</bod></html>"; 
?> 
+0

감사합니다. 나는 또한 db와 세션이 부트 스트랩에 속해야한다고 생각하지만, 헤더를 보내고 부트 스트랩 파일 (또는 포함 된 파일)에 반향하는 것은 오류 페이지를 표시하는 '젠드 방식'이 아닙니다. 리디렉션을 요청할 수있는 권한이 (직접적인) 액세스 권한을 가지고 있지 않습니다. 로깅과 함께 오류 컨트롤러가 있고, 이메일을 보냈고 거기에서 호출되는 멋진보기가 있습니다. 단지 'Zend way'로 만들고 싶었습니다. 나는 이것이 닭고기와 달걀 문제라고 생각한다. –

+0

오류 컨트롤러, loggin 등도 사용합니다. 그러나 "Zend Way"에서 정상적으로 잡아서 처리 할 수없는 일부 오류는 조기에 나타납니다. application.ini를 읽을 수 없는지 생각해보십시오. 지금 귀하의 응용 프로그램은 무엇을합니까? 어쨌든 낮은 수준의 처리가 필요합니다. –