기본 콘텐츠로 건너뛰기

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/



이 블로그의 인기 게시물

구글 결제에서 결제 수단 등록 문제

얼마 전 카드를 새로 만들어서 구글 결제의 결제 수단을 교체하려고 하였는데 카드 번호가 잘못되었다라고 하면서 등록이 되지 않았습니다. 관련해서 검색을 해보니 이런 문제가 흔히 발생하고 있더군요. 저처럼 당황하실 분들을 위해 구글 고객센터와 통화해 해결하면서 알아낸 것들을 공유하겠습니다.

넥서스 4 : 레퍼런스 그 이상의 폰

LTE 버전을 기대했는데 3G 폰으로 나와 고민을 하게 한 넥서스4(넥포). 기존에 사용하던 넥서스S(넥스)가 이젠 성능의 한계를 확실하게 보여주고 있어 다음 넥서스폰은 LTE로 나올 것을 기대하면 1년 정도 사용할 생각으로 구입했습니다. 지난 주 월요일에 받아 일주일 정도 사용해본 느낌을 정리해보겠습니다. 넥포의 스펙을 정리해 보면 아래와 같습니다. 4.7인치 화면 1280 x 768 해상도 8백만 화소 후면 카메라, 1.3백만 화소 전면 카메라 3G 모바일 네트워크 (HSPA+ 지원) 무선 충전 SlimPort HDMI 내장 저장공간 8G/16G 2G 메모리 퀄컴 스냅드래곤 S4 프로 (쿼드코어) 폰의 스펙은 LG 옵티머스G를 베이스로 만들어진 폰이라 현재 기준으로 부족한 점이 없습니다. 충분히 빠르고 충분히 여유롭게 안드로이드 4.2를 구동할 수 있는 폰이죠. 스펙에서 흥미로운 것은 무선 충전과 SlimPort HDMI 입니다. 무선충전은 WCP Qi 규격이라 아직 발매가 되지 않은 전용 충전기 이외에도 호환되는 제품으로는 충전이 된다고 하는데 7만원 정도에 호환 제품을 구매할 수 있더군요. SlimPort HDMI는 넥포의 마이크로 USB 포트에 어댑터를 연결해 HDMI 출력을 지원하는 것입니다. 넥스를 사용하다 넥포를 사용하면서 느껴지는 것은 당연히 빠르다입니다. 안드로이드라는 플랫폼이 하드웨어 스펙은 'more and more' 불필요하다할 정도로 높은 것이 좋다라는 것을 다시 체감하는 순간이었습니다. 적어도 체감 성능면에서는 아이폰을 포함해 다른 폰에 밀릴 것이 없는 넥포입니다. 손에 잡히는 느낌은 처음에는 좋은 편이 아닙니다. 4.7인치라 화면이 큰 것도 있지만 뒷면까지 유리로 되어 있어 아이폰4를 처음 잡아보았을 때 느껴지는 손에 착 달라붙지 못하고 미끄러지는 듯한 느낌을 넥포에서도 느낄 수 있었습니다. 그나마 아이폰4와는 달리 테두리가 부드러운 재질이라 그립감에

크롬북에서 리눅스 앱 사용 후기

새로 구입한 픽셀 슬레이트에서 리눅스 앱을 실행시켜본 후 작성한 후기입니다. 현재 크롬북에서 리눅스 앱을 실행시키는 기능은 베타이니 이점을 고려하시고 보시면 좋을 것 같습니다.