Zend Framework 2의 기본 구조는 각 모듈을 http 요청 주소에 맵핑되게 하는 것입니다. 즉, 'www.zf2.com/admin'은 zf2 어플리케이션의 admin 모듈에 연결되는 것이죠. 'admin.zf2.com'과 같은 서브 도메인을 사용하기 위해서는 admin 어플리케이션을 별도로 만들어야 하는데 이 구조가 문제가 있는 것은 아닙니다. 소규모 사이트의 경우 서브도메인을 사용하는 경우가 적고 큰 사이트의 경우는 각 서브도메인 별로 어플리케이션을 만드는 것이 좋기 때문입니다. 그러나, 작은 사이트에서 서브도메인을 사용하는 경우도 있을 수 있는데 이런 경우 작은 사이트들을 모두 개별 어플리케이션을 만드는 것보다는 하나의 어플리케이션에서 처리하는 것이 관리 면에서 리소스가 적게 들어갈 것입니다. 이럴 때 필요한 Zend Framework 2에서 서브도메인과 모듈의 연결 방법과 그에 필요한 몇가지 요소들에 대해 알아보겠습니다.
기본적으로 필요한 라우팅 설정은 Zend Framework 2의 레퍼런스 문서에 예제가 있습니다. 이 설정에서의 핵심은 'Zend\Mvc\Router\Http\Hostname' 타입의 라우터를 사용하는 것입니다. 이 라우터를 사용한 메인 사이트의 설정입니다. options 부분의 'route' 항목에 '/'와 같은 경로가 아니라 도메인 명이 들어 있는 것을 보실 수 있을 것입니다.
'routes' => array(
'www.zf2.com' => array(
'type' => 'Zend\Mvc\Router\Http\Hostname',
'options' => array(
'route' => '[:subdomain.]zf2.com',
'contraints' => array(
'subdomain' => 'www',
),
),
'child_routes' => array(
'index' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/',
'defaults' => array(
'controller' => 'Application\Controller\Index',
'action' => 'index',
),
),
'may_terminate' => true,
),
),
),
),
다음은 admin 서브도메인 설정입니다. options의 route 항목에 사용할 서브도메인이 들어 있습니다.
'routes' => array(
'admin.zf2.com' => array(
'type' => 'Zend\Mvc\Router\Http\Hostname',
'options' => array(
'route' => 'admin.zf2.com',
),
'child_routes' => array(
'index' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/',
'defaults' => array(
'controller' => 'Admin\Controller\Index',
'action' => 'index',
),
),
'may_terminate' => true,
),
),
),
),
이것으로 서브도메인과 모듈 연결을 위한 라우팅 설정이 끝났습니다. 간단하죠? 그런데, 이 설정만 추가하면 어플리케이션 안에 있는 모든 도메인이 같은 레이아웃을 사용하게 됩니다. 서브도메인별로 다른 레이아웃을 사용하려면 어떻게 해야할까요? 별도 레이아웃을 사용하려는 모듈의 Module.php에 아래와 같은 코드를 추가합니다.
public function init(ModuleManager $moduleManager)
{
$sharedEvents = $moduleManager->getEventManager()->getSharedManager();
$sharedEvents->attach(__NAMESPACE__, 'dispatch', function($event) {
$controller = $event->getTarget();
$controller->layout('layout/admin');
}, 100);
}
위 코드 중 '$controller->layout('layout/admin');' 부분에서 사용하는 'layout/admin' 레이아웃은 module.config.php에 먼저 설정되어 있어야 합니다.
개별 레이아웃으로 운영하는 서브도메인은 DB도 다른 도메인과 분리해야하는 경우가 생길 수 있습니다. Zend Framework 2에서 다중 DB 연결을 사용하기 위한 설정입니다. 우선 global.php에 아래 설정을 추가합니다.
'db' => array(
'adapters' => array(
'db_main' => array(
'driver' => '드라이버',
'hostname' => '서버',
'database' => 'db이름',
),
'db_admin' => array(
'driver' => '드라이버',
'hostname' => '서버',
'database' => 'db이름',
),
),
),
'service_manager' => array(
'abstract_factories' => array(
'Zend\Db\Adapter\AdapterAbstractServiceFactory',
),
),
그리고, local.php 설정입니다.
'db' => array(
'adapters' => array(
'db_main' => array(
'username' => '유저아이디',
'password' => '패스워드'
),
'db_admin' => array(
'username' => '유저아이디',
'password' => '패스워드'
),
),
),
module.config.php나 Module.php에서 각 DB 연결을 가지고 오기 위해서는 아래와 같이 합니다.
$serviceManager->get('db_admin');
하나의 어플리케이션 안에서 서브도메인을 모듈과 연결해 운영하는데 필요한 라우팅,레이아웃,DB연결에 대한 것을 알아보았습니다. Zend Framework는 우수한 PHP 프레임워크이지만 국내 자료가 적어 처음 Zend Framework를 이용해 사이트를 개발하려는 분들은 어려움이 있을 수 있습니다. 제 자료가 그런 분들에게 도움이 되었으면 합니다.
===
Project just4fun : http://www.just4fun.kr/