Agavi-0.11でシステムアクションをcontextごとに分ける

Agavi-0.11でデフォルトアクション、ログインアクション、セキュアアクション、Error404アクションなどのシステムアクション(system-actions)の定義はsetting.xmlで行うが、ここではcontextによる分岐は例外テンプレートを除いては利用できない。
そこで、どうしてもやりたい場合は次のようにすると良いとDavidが言っていたので紹介します。

前提

  • モジュールはSystem,Frontend,Backendがある。
  • Frontendモジュールはユーザ側
  • Backendモジュールは管理側
  • 今回分岐したいのはLoginアクション

System.Loginの作成

振り分けを行うには次のようなActionとViewを用意する

Action:
<?php
class System_LoginAction extends AgaviAction
{
  public function getDefaultViewName()
  {
    return 'Proxy';
  }
}
?>

View:
<?php
class System_LoginProxyView extends AgaviView
{
  public function execute (AgaviRequestDataHolder $rd)
  {
    $config = include(AgaviConfigCache::checkConfig(AgaviConfig::get('core.config_dir') . "/system_actions.xml", $this->context));
    return $this->createForwardContainer($config['login']['module'], $config['login']['action']);
  }
}
?>

設定ファイル

まずはsetting.xmlでSystem.Loginをログインアクションに指定してから、system_actions.xmlを次のようにする

<?xml version="1.0" encoding="utf-8" ?>
<configurations xmlns="http://agavi.org/agavi/1.0/config">
  <configuration context="frontend">
    <login>
      <module>Frontend</module>
      <action>Login</action>
    </login>
  </configuration>
  <configuration context="backend">
    <login>
      <module>Backend</module>
      <action>Login</action>
    </login>
  </configuration>
</configurations>

あとはFrontend.Login,Backend.Loginをそれぞれ実装すればOKです。