アクション継続
(Piece_Unity >= 0.9.0)
アクション継続は、セッション?(フロー変数?及びセッション変数?)を意識することのないアクションクラス?のプログラミングを可能にする機能です。
Piece_Unity 0.8.0までは、リクエスト毎に新規のアクションクラス?のインスタンスが作成されていました。この場合、アクション?自体はステートレスであり、ステートフルなプログラミングはフロー変数?を使うことによってのみ実現されていました。したがって、開発者はフロー変数?を意識したプログラミングを行う必要がありました。
Piece_Unity 0.9.0から導入されたアクション継続は、この状況を改善します。Piece_Unityのアーカイブに含まれているサンプルアプリケーションから、RegistrationActionクラスを取り出し、比較してみます。
Piece_Unity 0.8.0:
<?php function validate() { $user = &new stdClass(); $this->_flow->setAttributeByRef('user', $user); $validation = &$this->_payload->getValidation(); if ($validation->validate('Registration', $user)) { return 'goDisplayConfirmation'; } else { return 'goDisplayForm'; } } function setupForm() { $this->_setupFormAttributes(); $viewElement = &$this->_payload->getViewElement(); if ($this->_flow->hasAttribute('user')) { $user = &$this->_flow->getAttribute('user'); $fields = $this->_getFormFields(); $elements = $this->_getFormElements(); foreach ($fields as $field) { $elements[$field]['_value'] = $user->$field; } $viewElement->setElement('_elements', $elements); } } function setupConfirmation() { $this->_setupFormAttributes(); $user = &$this->_flow->getAttribute('user'); $viewElement = &$this->_payload->getViewElement(); $viewElement->setElementByRef('user', $user); }
Piece_Unity 0.9.0:
<?php var $_user; function RegistrationAction() { $this->_user = &new stdClass(); } function validate() { $validation = &$this->_payload->getValidation(); if ($validation->validate('Registration', $this->_user)) { return 'goDisplayConfirmationFromProcessConfirmForm'; } else { return 'goDisplayFormFromProcessConfirmForm'; } } function setupForm() { $this->_setupFormAttributes(); $fields = $this->_getFormFields(); $elements = $this->_getFormElements(); foreach ($fields as $field) { $elements[$field]['_value'] = @$this->_user->$field; } $viewElement = &$this->_payload->getViewElement(); $viewElement->setElement('_elements', $elements); $viewElement->setElement('useAHAH', $this->_useAHAH); $this->_configureLayout(); $this->_setTitle(); } function setupConfirmation() { $this->_setupFormAttributes(); $viewElement = &$this->_payload->getViewElement(); $viewElement->setElementByRef('user', $this->_user); $viewElement->setElement('useAHAH', $this->_useAHAH); $this->_configureLayout(); $this->_setTitle(); }
Piece_Unity 0.8.0の方は、validate()の最初に、
<?php function validate() { $user = &new stdClass(); $this->_flow->setAttributeByRef('user', $user);
のようにオブジェクト$userを作成し、それをフロー変数?userとして設定しています。そして、setupForm()やsetupConfirmation()でuserオブジェクトをフロー変数?から取得して使っています。Piece_Unity 0.8.0までは、この方法がステートフルなプログラミングを可能にする唯一のものでした。
Piece_Unity 0.9.0 の方は、$this->_userを用意し、コンストラクタで初期化しています。
<?php var $_user; function RegistrationAction() { $this->_user = &new stdClass(); }
もちろん、コンストラクタ以外での初期化も問題ありません。初期化以降は、そのリクエスト中はもちろん、複数のリクエストにまたがったとしても、このオブジェクトは常に$this->_userプロパティとしてアクセスすることができます。Piece_Unity 0.8.0のように明示的にフロー変数?にアクセスする必要はありません。
<?php $viewElement->setElementByRef('user', $this->_user);
アクション継続によりアクションクラス?のインスタンスはフロー実行毎に一度だけ生成され、透過的にフロー変数?に保存されます。アクションクラス?のインスタンスは、そのフロー実行への次のリクエストで、(Piece_Unityのセッションプリロード機構によって)透過的に復元されます。よって、開発者は何も意識することなく、アクション?が継続している前提でプログラミングできるのです。
アクション継続を有効にするにはDispatcher_Continuationプラグイン?の設定ポイントbindActionsWithFlowExecution?をtrueに設定してください。
アクション継続はPiece_Unity 0.10.0からデフォルトで有効です。
ユーザコメント
