Phalconでマルチモジュールのルーティング
Phalconのマルチモジュールプロジェクトで、frontendとbackendのモジュールがあるとします。
frontendはhttp://localhost/phalcon-multiple-module/、backendはhttp://localhost/phalcon-multiple-module/admin でアクセスできるようにルーティングします。
frontend側はsetDefaultModule()(名前空間を使う場合はsetDefaultNamespace()も)するだけでシングルモジュールと同じルーティングになりますが、backend側も同じルールのルーティングを適用しようとした場合、ちょっと面倒くさいです。
PhalconのルーティングはPhalcon\Mvc\Routerのaddメソッドで追加していきます。
/adminでアクセスした場合
/adminでアクセスした場合はIndexControllerのindexActionにルーティングします。
/admin/でアクセスした場合のルーティングも必要になります。
php
$router->add( '/admin', array(
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 'index' ,
'action' => 'index'
));
$router->add( '/admin/', array(
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 'index' ,
'action' => 'index'
));
/admin/indexでアクセスした場合
コントローラーはプレイスフォルダーを使用します。
actionはindexにルーティングします。
php
$router->add( '/admin/:controller', array (
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 1,
'action' => 'index',
));
$router->add( '/admin/:controller/', array (
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 1,
'action' => 'index',
));
/admin/index/indexでアクセスした場合
コントローラー、アクション共にプレイスフォルダーを使用します。
php
$router->add( '/admin/:controller/:action', array (
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 1,
'action' => 2,
));
$router->add( '/admin/:controller/:action/', array (
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 1,
'action' => 2,
));
パラメーター付きでアクセスした場合
/admin/index/index/param1のようにアクセスした場合です。
この場合、次の記述だけで/admin/index/index/param1/でもアクセスできました‥
php
$router->add('/admin/:controller/:action/:params',array(
'namespace' => 'Multiple\Backend\Controllers',
'module' => 'backend',
'controller' => 1,
'action' => 2,
'params' => 3,
));
最終的にRouterの設定は次のようになりました。
php
// config/routes.php
$router = new Phalcon\Mvc\Router();
$router->setDefaultModule("frontend");
$router->setDefaultNamespace("Multiple\Frontend\Controllers");
$router->add( '/admin', array(
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 'index' ,
'action' => 'index'
));
$router->add( '/admin/', array(
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 'index' ,
'action' => 'index'
));
$router->add( '/admin/:controller', array (
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 1,
'action' => 'index',
));
$router->add( '/admin/:controller/', array (
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 1,
'action' => 'index',
));
$router->add( '/admin/:controller/:action', array (
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 1,
'action' => 2,
));
$router->add( '/admin/:controller/:action/', array (
'namespace' => 'Multiple\Backend\Controllers' ,
'module' => 'backend',
'controller' => 1,
'action' => 2,
));
$router->add('/admin/:controller/:action/:params',array(
'namespace' => 'Multiple\Backend\Controllers',
'module' => 'backend',
'controller' => 1,
'action' => 2,
'params' => 3,
));
return $router;
※ githubにソースを置きました。