기본 콘텐츠로 건너뛰기

Zend Framework 2에서의 서브도메인과 모듈 연결



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/



댓글

이 블로그의 인기 게시물

안드로이드 웨어의 오레오 업데이트

제가 사용하고 있는 엘지 워치 스타일에 대한 안드로이드 오레오 업데이트가 배포되었습니다. 작년 12월초에 엘지 워치 스포츠를 시작으로 발표된 업데이트이니 2달이 걸렸네요. 안드로이드 웨어 오레오 업데이트는 OS적으로 크게 변한 것은 없고 몇가지 기능들이 추가된 업데이트입니다. 이번 업데이트에서 추가된 기능들에 대해 간단히 알아보겠습니다.

파일 관리자 (Clean File Manager) : 깔끔한 안드로이드 파일 관리 앱

안드로이드의 파일 관리 앱으로는 '아스트로 파일 관리자'나 'ES 파일 탐색기'가 유명한데 이 앱들은 저에게는 너무 번잡한 앱들입니다. 파일 관리라는 단순한 기능이 필요한 저로서는 너무 많은 기능을 가지고 있어 무겁고 인터페이스도 어색한 앱들이어서 대안을 찾다가 괜찮은 앱이 있어 소개합니다.

'파일 관리자 (Clean File Manager)'는 위 두 앱들에 비해 기본에 충실한 앱입니다. 클라우드 서비스를 지원하지도 않고 PC 접속 기능도 없습니다. 파일 관리를 제외한 기능으로는 설치된 앱 목록을 표시해주는 기능이 거의 유일한 부가 기능입니다. 그러나, 저처럼 단순한 파일 관리 앱을 원하는 사람에게는 딱인 앱이죠.


PHP에서 보안 문제를 해결하는 법

한빛미디어 홈페이지에 'PHP에서 보안 문제를 해결하는 법' 이라는 기사가 있습니다. PHP로 개발시 주의해야하는 3가지 보안 문제와 이를 막는 방법에 대한 외국 기사를 번역한 기사인데 관련 사항을 잘모르시는 분들에게 도움이 될 것 같아 기사에 소개된 내용들에 제 생각을 추가하여 정리해보겠습니다.