アクション定義を省略する
アクションを定義する場合、厳密にはコントローラの$actionメンバ変数に以下のようなエントリを追加する必要があります。
'some_action' => array( 'form_name' => 'Sample_Form_SomeAction', 'form_path' => 'Some/Action.php', 'class_name' => 'Sample_Action_SomeAction', 'class_path' => 'Some/Action.php', ),
しかし、1アクション毎にこれらのエントリを定義するのはあまりに煩雑なので、実際には以下のようにアクション定義を省略することが出来ます。
'some_action' => array(),
さらに、これさえも面倒な場合はコントローラへのアクション定義そのものを省略することも可能です(Mojavi方式*1)。
// 何もなし
ここでは、コントローラのアクション名決定方法と、アクション定義が省略された場合のアクションスクリプト名、アクションクラス名等の決め方について記述します。
アクション名の決定方法
Ethnaフレームワークのアクションは以下の手順で決定されます。実は結構複雑ですが、割とどうでも良いことなので読み飛ばして頂いても構いません。
- クライアントから送信されたフォーム値を解析してアクション名を決定する*2
- アクション名に対応するアクション定義(コントローラの$actionメンバのエントリ)を取得する
- アクションスクリプトを読み込む
- アクション定義に'class_path'属性が存在すればそのファイルをインクルード
- アクション名から決定されるデフォルトのアクションスクリプト*3が存在すればそのファイルをインクルード
- どちらも存在しなければactionディレクトリ以下の全てのファイルをインクルード
- (アクションフォームについても同様)
- アクション定義に'class_name'属性が存在しない場合、デフォルトのアクションクラス名を設定*4
- 4.で決定されたアクションクラスが定義されていれば正しいアクション名とみなす
アクションクラスが定義されていない場合、$fallback_action_nameをアクション名とみなしてアクションを実行する(($fallback_action_nameについては 未定義のアクションが指定された場合に特定のアクションを実行するを参照してください))
アクション定義の省略方法
アクション名の決定方法はなかなか複雑ですが、アクション定義の省略方法は簡単です。要するに
- アクション名に対応するアクションスクリプトを作成する
- 1.で作成したファイルにアクション名に対応するアクションクラスを定義する
とう2つの手順だけでOKです。
アクション名が"some_action_name"だとすると、アクション定義省略時にインクルードされるアクションスクリプトは
Some/Action/Name.php
となります("_" -> "/"+先頭1文字を大文字)。
また、アクションクラス名は
{$アプリケーションID}_Action_SomeActionName
そしてアクションフォーム名は
{$アプリケーションID}_Form_SomeActionName
となりますので、これらの命名規則に従ってファイルを作成し、クラスを定義しておけばアクション定義を記述しなくても所定のアクションが実行されます。
補足
なお、これらの命名規則はアプリケーションによって好みの形に変更することが出来ます。詳細は下記をご覧下さい。
see also: アクションクラスの命名規則を変更する
また、定義した命名規則に従っていちいちファイルを作成するのが面倒な場合は、binディレクトリに生成されるgenerate_action_script.phpを利用することで、アクションスクリプトのスケルトンを生成することが出来ます。
see also: アクションスクリプトのスケルトンを生成する
*1 勝手に命名
*2 アクション名の決定方法についてはアクション名の決定方法を変更するを参照してください
*3 デフォルトのアクションスクリプトの決定方法についてはアクションクラスの命名規則を変更するを参照してください
*4 デフォルトのアクションスクリプトの決定方法についてはアクションクラスの命名規則を変更するを参照してください