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; };
以上でルーティング設定は完了。