【Phalcon】multi-module での ルーティング設定

multi-moduleの設定


以下のディレクトリ構成を対象とする。
adminディレクトリは管理用で、
frontendはユーザー用に用意している。
何かスゴイ見づらいけど・・・。


▾ root/
▾ apps/
▾ admin/
▸ controllers/
▸ views/
Module.php
▸ config/
▾ frontend/
▸ controllers/
▸ views/
Module.php
▸ libs/
▸ models/
▾ config/
modules.php
services.php
▸ public/
index.html

/root/config/service.php でルーティングの設定をする。
ポイントはadminディレクトリのルーティングを
以下の4パターン全て設定していること。
全て設定しないとちゃんとルーティングしてくれなかった。
・/admin
・/admin/controller
・/admin/controller/action
・/admin/controller/action/param

frontendはデフォルトで設定しているので問題ないが、
ルートアクセスだけ設定する。

<?php
$di['router'] = function () {

    $router = new Router();

	$router->removeExtraSlashes(true);

	$router->setDefaultModule('frontend');
	$router->setDefaultNamespace('Dir_project\Frontend\Controllers');

	$router->notFound(array(
		'namespace' => 'Dir_project\Admin\Controllers',
	    'module' => 'admin',
		'controller' => 'index',
		'action' => 'show404'
	));

	//frontendのルートアクセス
	$router->add(
        '/', 
        array(
            'namespace' => 'Dir_project\Frontend\Controllers',
            'module' => 'frontend',         
        )                      
    );


	//adminの設定
	$router->add(
		'/admin', 
		array(
		    'namespace' => 'Dir_project\Admin\Controllers',
		    'module' => 'admin',
		)
	);
	$router->add(
		'/admin/:controller', 
		array(
		    'namespace' => 'Dir_project\Admin\Controllers',
		    'module' => 'admin',
			'controller' => 1,
		)
	);
	$router->add(
		'/admin/:controller/:action', 
		array(
		    'namespace' => 'Dir_project\Admin\Controllers',
		    'module' => 'admin',
			'controller' => 1,
			'action' => 2,
		)
	);
	$router->add(              
        '/admin/:controller/:action/:params',                                                                         
        array(                 
            'namespace' => 'Dir_project\Admin\Controllers',
            'module' => 'admin',            
            'controller' => 1, 
            'action' => 2,     
            'params' => 3      
        )                      
    );

    return $router;
};

/root/config/service.php の設定で正しいルーティングは動作するようになったが、
存在しないController, Action にアクセスすると、
Dispatcherで例外が出てしまう。
この場合は Router の設定に関係なく処理が終了してしまうので、
Dispatcherの例外を補足し、404ページのような任意のページに飛ばす必要がある。

Dispatcherの例外補足は frontend, admin でそれぞれ設定する必要がある。
今回は /root/apps/admin/Modules.php を例に /apps/admin/IndexController::show404Action() に飛ばしている。
/root/apps/frontend/Modules.php も同じように設定すればOK。

<?php
$di['dispatcher'] = function() {

	$eventsManager = new \Phalcon\Events\Manager();
	$eventsManager->attach('dispatch:beforeException', function($event, $dispatcher, $exception) {
	    switch ($exception->getCode()) {
	        case \Phalcon\Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:
	        case \Phalcon\Dispatcher::EXCEPTION_ACTION_NOT_FOUND:
				//任意の飛び先を指定
	            $dispatcher->forward(array(
	                'namespace' => 'Dir_project\Admin\Controllers',
	                'module'=>'admin',
	                'controller'=>'index',
	                'action'=>'show404'
	            ));
	            return false;
	    }
	});
	
	//Dispatcherの基本動作を設定
	$dispatcher = new \Phalcon\Mvc\Dispatcher();
	$dispatcher->setEventsManager($eventsManager);
	$dispatcher->setDefaultNamespace('Modules\Admin\Controllers');
	
	return $dispatcher;
};


以上でルーティング設定は完了。