読者です 読者をやめる 読者になる 読者になる

Piece FrameworkでRenderer_Redirectionを使う

PHP

Piece FrameworkでURLリダイレクトをさせるやり方が気になったので、調べてみました。

http(s)で始まるビューを指定すると、Renderer_Redirectionを使ってリダイレクトさせることができます。
ある状態に達したら必ずリダイレクトさせる場合は、フロー定義の中で、例えば次のように記述します。

viewState:
  - name: SomeViewState
    view: http://localhost/another/action.php?code=a
    activity:
      class: SomeAction
      method: someProcess

デフォルトの状態では、外部URLにリダイレクトさせることはできず、自動的に$_SERVER['SERVER_NAME']に飛ばされますので、URLのホスト名はそれほど重要ではありません。
リダイレクト先にパラメータを渡す場合は、あらかじめクエリ文字列にダミーの値を追加しておきます。ここで定義したURLのクエリ文字列の中に含まれないパラメータは除去されます。
その上で、アクションのなかでViewElementを取得して、実際に渡す値を設定します。

_doSomeThing();
	    if ($error) {
            // codeというパラメータをつけてリダイレクトさせます
            $element =& $this->_payload->getViewElement();
            $element->setElement('code', $code);
	    }
    }
}
?>

アクションの中で、動的にリダイレクトする、しないを切り替えることはできません。(もしかしたら、Piece_Flowオブジェクトを取得して、いろいろ頑張ればできるかもしれませんが、推奨はされないと思います。)
次のようなコードは実際には動作しません。

...
class SomeAction extends Piece_Flow_Action
{
    function anotherProcess() {
        // ...何らかの処理

        // アクションの中で動的にリダイレクトの設定をした(つもり・・・)
        if ($someCondition) {
            $this->_payload->setView('http://localhost/error.php');
        }
    }
}
...

外部サイトへのリダイレクトを可能にするには、Renderer_RedirectionのexternalURL属性を設定します。
アプリケーション全体で外部URLへのリダイレクトを許可するならば、piece-unity-config.yamlの中に以下のような設定を加えると便利です。

# piece-unity-config.yaml
- name: Renderer_Redirection
  point:
    - name: externalURL
      type: configuration
      value: true

次のように、Piece_Unityをdispatchする前に設定すれば、スクリプトごとに外部URLリダイレクトのオン・オフを切り替えられます。

...
$config =& new Piece_Unity_Config();
$config->setConfiguration('Renderer_Redirection', 'externalURL', True);
$unity =& new Piece_Unity($configDir, $cacheDir, $config);
$unity->dispatch();
...