2013-04-11 3 views
4

젠드 (Zend) 또는이 전체 프레임 워크 개념은 저에게 새로운 것입니다. 몇 가지 예는 Modulegateway 형식을 기반으로합니다.이 형식에서는 Module.php에서 해당 컨트롤러와 관련된 테이블의 이름을 정의합니다.테이블 게이트 웨이 및 어댑터를 사용하는시기

/* 'MYMODULE\Model\CompanyTable' => function($sm) { 
       $tableGateway = $sm->get('CompanyTableGateway'); 
       $table = new CompanyTable($tableGateway); 
       return $table; 
      }, 
      'CompanyTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Company()); 
       return new TableGateway('rs_company', $dbAdapter, null, $resultSetPrototype); 
      },*/ 

그리고 다른 예에서 __constuct을 통해 intializing 만 3 어댑터에 대해 이야기 Module.php 코드의 라인()

'MYMODULE\Model\CompanyTable' => function($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $table = new CompanyTable($dbAdapter); 
       return $table; 
      }, 

public function __construct(Adapter $adapter) { 
    $this->adapter = $adapter; 
    $this->resultSetPrototype = new ResultSet(); 
    $this->resultSetPrototype->setArrayObjectPrototype(new Company()); 

    $this->initialize(); 
} 
클래스 __construc()에있다

내가 이해할 수없는 것은 두 가지 방법 중에서 선택하는 방법입니다.

답변

11

간단히 말하면, 서비스 (공장)를 Zends 서비스 관리자에 등록하면 응용 프로그램의 많은 클래스와 모듈에서 액세스 할 수 있습니다. 그들은 필요할 때 갈 준비가 된 미리 포장 된 물건과 같습니다! 요점은 이미 그들이 이미 주입에 의존하는 모든 것을 가지고 있다는 것입니다.

이제 서비스 관리자에서 module.config.php 또는 Module.php에서와 같이 다양한 방법으로 서비스를 등록 할 수 있습니다. 선택 사항은 귀하가 선택한 것입니다. 기억해야 할 중요한 점은 당신은 단지 무언가를 요구할 수 있고 모든 기본 세부 사항에 대해 걱정할 필요가 없다는 것입니다.

기본 DB 어댑터 : 당신이 기본 응용 프로그램 설정 (global.php 및 local.php 파일)에 데이터베이스 설정을 구성한 경우이 어댑터가 자동으로 서비스 매니저에 등록 .

$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 

지금, 당신은 다시 선택은 당신입니다, 어떤 TableGateway 또는 테이블 모델없이 데이터베이스 기능을 수행하는이 어댑터를 사용할 수 있습니다. 컨트롤러 내에서이 서비스를 가져올 수 있으며 모델에이를 삽입 할 수 있습니다.

테이블 모델 : 아래 코드에서 수행하는 작업은 테이블 모델에 어댑터를 주입하는 것입니다. 따라서 응용 프로그램 내에서 서비스 관리자로부터 Table 모델 서비스를 간단히 가져올 수 있으며 이미 어댑터가있을 것입니다.

'MYMODULE\Model\CompanyTable' => function($sm) { 
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
    $table = new CompanyTable($dbAdapter); 
    return $table; 
}, 

표 모델은 무엇입니까? 글쎄, 그것은 테이블의 프로토 타입이 될 수도 있고, 테이블을위한 함수의 클래스이거나, 둘 다 될 수도 있습니다. 기술적으로, 당신은 테이블 모델을 만드는 하나입니다, 그래서 당신은 기능의 모든 종류를 생성하고 같은 물건의 모든 종류를 주입 수 : 여러 다른 데이터베이스 어댑터를 페일 오버 한 무슨 경우, 이것에 대해 생각

'MYMODULE\Model\CompanyTable' => function($sm) { 
    $table = new CompanyTable(); 
    $table->setAdapterService($sm->get('Zend\Db\Adapter\Adapter')); 
    $table->setSessionService($sm->get('MYMODULE\Session')); 
    $table->setCustomService($sm->get('MYMODULE\Custom')); 
    return $table; 
}, 

기본 또는 보조 데이터베이스가 다운 된 경우 첫 번째 사용 가능한 어댑터를 삽입 할 수 있으며 응용 프로그램은 Table 모델을 호출 할 때 그 차이를 알 수 없습니다.

TableGateway : TableGateway는 정확히 들리는 소리입니다. Zend TableGateway의 인스턴스이며 테이블 이름 Db Adapter가 주어지며 테이블 모델로 프로토 타입을 만들 수도 있습니다. 프로토 타이핑이란 무엇입니까? 글쎄, 기본적으로 데이터베이스 쿼리를 만들 때 데이터가있는 일반 결과 집합을 반환하는 대신 데이터를 테이블 모델의 인스턴스로 반환합니다.다시 말하지만, 서비스 관리자에 게이트웨이를 등록 할 때 중요한 점은 응용 프로그램이 테이블의 어댑터 나 이름 또는 다른 것에 대해 걱정할 필요없이 응용 프로그램이이를 사용하고 사용하는 것이 중요하다는 것입니다. 이 예제에서는 Table 모델로 프로토 타입을 만들었지 만 반드시 그렇게 할 필요는 없습니다.

'CompanyTableGateway' => function ($sm) { 
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
    $resultSetPrototype = new ResultSet(); 
    $resultSetPrototype->setArrayObjectPrototype(new Company()); 
    return new TableGateway('rs_company', $dbAdapter, null, $resultSetPrototype); 
}, 

TableGateway를 사용하여, 당신은 당신의 표 모델 대신 어댑터를 제공 할 수있다, 당신은 모든 DB 기능에 대한 게이트웨이를 사용하도록 테이블 모델을 작성합니다.
'MYMODULE\Model\CompanyTable' => function($sm) { 
    $tableGateway = $sm->get('CompanyTableGateway'); 
    $table = new CompanyTable($tableGateway); 
    return $table; 
}, 

그래서 요약, 질문에 대한 대답은 : 선택은 당신입니다. 자체적으로 Db 어댑터를 사용하거나 테이블 모델 및/또는 테이블 게이트웨이와 함께 사용하십시오. 잘하면이 도움이됩니다!