<< Piece_Unityユーザーズマニュアル

アクション継続

(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からデフォルトで有効です。


<< Piece_Unityユーザーズマニュアル

ユーザコメント

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found