2

에 요청 객체를 얻기 :
이있는 내가 URI 매개 변수 로켈을 얻을
example.com/controller/action/locale.젠드 프레임 워크 - 나는 URL 양식을 다음과 같이 사이트를 설계하고 부트 스트랩

부트 스트랩에서 Zend_Locale, Zend_Translator 또는 구성 요소와 같이 Zend_Validate_Date를 구성하는 다른 리소스를 초기화하려는 경우 모두 로캘 데이터가 필요합니다. 또한 수신 된 로켈에 따라 다른 데이터베이스를 사용하고 싶을 수도 있습니다. 하지만 정상적으로 부트 스트랩에서 uri 매개 변수를 사용할 수 없기 때문에 컨트롤러 플러그인에서 위의 모든 내용을 초기화해야합니다.

결론적으로 요청 객체와 uri 매개 변수가 부트 스트랩에서 사용 가능해야한다고 생각합니다. 따라서 Zend Framework의 현재 디자인에는이 점이 빠져 있습니다.

내가 맞았나요?

답변

2

죄송하지만, 당신이 제안하는 것은 좋지 않은 생각입니다.

  • 는 ('include_path도'
  • 초기화 문자 세트에 사용자 정의 경로를 추가 부트 스트랩은

    일부 물건 bootstrappers이해야하는 등 필요한 설정, 변수를 초기화하여 작업 상태로 라이브러리를 얻을 것을 의미한다 UTF-8)과 부호화 지시 (mb_internal_encoding)

  • 초기화 로거 (또는 응용 프로그램 오류 로깅)
  • 초기화 오토로더
,

애플리케이션이 컨트롤러 레이어에서 요구 사항을 처리해야합니다. 예를 들어 사용자가 example.com/controller/action/en-US를 방문하면 컨트롤러는 요청 객체 (및 지정된 매개 변수)에 액세스하여 언어를 적절히 설정하고 사용자 세션 var을 설정하여 현재 페이지와 이후 페이지를 영어로 표시 할 수 있습니다 .

- 편집 - 부트 스트랩 통과 값 대 중간 클래스를 사용하여 국제화/로케일 설정을 초기화

예 구현 :

// Controller 

$i18n = new i18n(); 

$i18n->setLocale($this->getRequest()->getParameter('locale')); 

// Now I can make locale specific calls to validate localized data 
$i18n->validateDate($this->getRequest()->getParameter('date')); 

// Can also make queries for locale specific data 
$results = $i18n->getDob()->query('select * from my_table'); 

// i18n class 
class i18n 
{ 
    protected $locale; 

    public function setLocale($locale) 
    { 
     $this->locale = $locale; 
    } 

    public function getLocale() 
    { 
     return $this->locale; 
    } 

    // Factory method for creating a database object based on locale 
    public function getDbo() 
    { 
     switch ($this->getLocale()) { 

      case 'en-US': 
       return new Zend_Db::factory('Pdo_Mysql', array(
        'host' => 'hostname', 
        'username' => 'username', 
        'password' => 'password', 
        'dbname' => 'en_us_locale' 
       )); 

      case 'en-GB': 
       return new Zend_Db::factory('Pdo_Mysql', array(
        'host' => 'hostname', 
        'username' => 'username', 
        'password' => 'password', 
        'dbname' => 'en_gb_locale' 
       )); 
     } 
    } 
} 
+0

괜찮 으면 좋겠지 만 경로, 데이터베이스 등을 포함한 내 리소스의 일부 구성이 있다면 어떻게 될까요?locale 매개 변수에 따라 변경됩니다. 부트 스트랩에서 초기화 할 수 없기 때문입니다. 컨트롤러 플러그인에서 모두 초기화해야합니까? 나는 이것이 좋은 생각이라고 생각하지 않습니까? –

+0

상위 수준의 부트 스트랩 클래스를 생성 할 수 있습니다. 요청 객체를 전달한 다음 현재 값에 따라 include_path 및 데이터베이스 연결을 초기화합니다. 끝내기 게임은 기본 부트 스트랩에 요청 레벨 데이터를 전달하지 않는 것입니다. 가능한 한 벙어리가되어야하며 사용을 위해 라이브러리 만 초기화해야하기 때문입니다. –

+0

네, 아마도 이것은 좋은 해결책이 될 수 있습니다. 컨트롤러 플러그인을 부트 스트랩으로 만들고 여기에 일부 부트 스트랩 리소스를 변경하거나 초기화하십시오. –

1

당신이해야 할 것은 사용자 정의 플러그인을 쓰기 I입니다 생각한다.

나는이 링크를 찾고 시작할 것이라고

이 플러그인에 익숙해하기 : http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.locale

그리고 마지막으로 : http://framework.zend.com/manual/en/zend.controller.plugins.html

다음이에서 들여다 봐도 (당신이 원하는 무엇의 일부가 될 것 같다) 만약 당신이 자신 만의 플러그인을 만들었다면 (아마도 당신이하고있는 일에)

$request->getParam();
변수를 사용하고있을 것입니다. preDispatch function

다음은 requ의 모듈을 기반으로 레이아웃 파일을 전환하는 작은 사람입니다 est - 잘하면 그것은 당신에게 약간의 통찰력을 준다.

<?php 
    /* 
* Theme Switcher 
* Set the current module name as $this->skin in the layout 
* 
* 
*/ 
class My_Controller_Plugin_Themer extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $module_name = $request->getModuleName(); 
     $view  = Zend_Layout::getMvcInstance()->getView(); 
     $view->skin  = $module_name; 
    } 
}?> 
+0

현재 로케일에 대해 이와 같은 플러그인을 사용하고 있습니다. 로케일 자원을 부트 스트랩에 설정 옵션을 설정하지만 컨트롤러 플러그인에서 실제로 초기화합니다. 그러나 실제로 로케일 데이터가 필요할 때까지 로케일 데이터를 사용하는 모든 리소스를 지연로드에 다시 설계해야합니다. 그래서 저는 Zend_Locale, Zend_Translator를 게으른로드로 확장 시켰습니다. 실제 초기화는 젠드 프레임 워크의 잘못된 디자인의 이유라고 생각합니다. –