BEARはページ設計指向のフレームワークです。フロントコントローラを持たず、画面単位でページクラスを定義しページコントローラとして機能します。
URLをパラメータとしてアプリケーションとして振る舞う一般のMVCフレームワークと対照的に、htdocs/におかれたページが独立した(スタティックHTMLと同様に)リソースとして表現されます。BEARではURLの構造を規定するのはフレームワークではなく、アプリケーション設計者です。
Note:
アプリケーション要求によってフロントコントローラー設置のメリットが多きい/必要だと認めた時にはアプリケーション作成のフロントコントローラーを設置します。ページをスクリプトとして実行するとことと(include)ページクラスを読み込む(BEAR_Main::include)事が可能です。ページコントローラがフロントコントローラーに対応するコストは高くないとしょう。
Note:
ページはコントローラであると同時にリソースとしても振る舞うこともできます。※引き数が渡されその出力HTMLまたはページにsetされたリソースが返り値になります。
ページはユーザーからみてサービスである一方、リソースを操作するクライアントでもあります。一般にページクラスの中身はリソースを操作するだけのものになるでしょう。ページイベント(イベントなし、クリック、フォームアクション)に応じたリソース操作を記述します。
ページ内でリソースに対して”操作”するだけです、リソースのインスタンスの生成、管理、キャッシュなどはページ内での仕事ではありません。ページクラスにインジェクトするリソースブラウザクラス(BEAR_Resource)を利用します。
ページをpage://のURLスキーマとしてページリソースとして、webブラウザ以外のクライアントから扱うこともできます。そのときのページから、リソースのアクセスはリソースのレイヤリングとなります。そのときpageクラスの出力ハンドラによるページのHTML化は無視され、変数やシリアライズされたテキストフォーマットとしてweb以外のクライアントに返されます。
定義されたPageクラスはMainクラスによりコールされます。ページクラスもBEARの別のクラス同様に、共通コンスラクタ、インジェクタの後に、ページのイベントに基づいてMainクラスからメソッドがコールされます。
クリックという仕組みがあり、特定のリンクとページのメソッドを紐づけることができます。同じURL=ページクラスで機能や画面を変えるときに利用します。例えば記事ページ記事リソースをreadし表示しているが、"delete"イベントが発生すると delete操作が行われ、”削除しました"画面が出るといった具合です。またリダイレクト時も仮想的なリンクを"クリック"してページ移動できます。
onで始まるページクラスのメソッド(ページハンドラと呼びます)がBEARからコールされ実行されます。
メソッド名 | 動作 |
---|---|
onInject() | インジェクションハンドラ |
onInit(array $args) | 初期化ハンドラ |
onOutput() | 出力ハンドラ |
onAction(array $submit) | アクションハンドラ |
onClick() | アクティブリンクハンドラ |
onException(Exception $e) | 例外ハンドラ |
基本はonInject()。onInit()、onOutput()がコールされページが出力されます。これにクリック、認証、フォームサブミットなどが加わるとそれぞれのハンドラがコールされます。
ページクラスが持つメソッドは多くありません。主要なものはこれだけです。
メソッド | 動作 |
---|---|
set($key, $values) | ページにリソースや変数をセットする |
display($tpl) | セットされたものにページテンプレートを適用してHTML表示する |
ページクラス名にはURLをクラス名にして頭にPage_をつけたものを指定します。URLが/user/entyry/index.phpならPage_User_Entry_Indexです。イベント定義したPageクラスをBEAR_Mainを継承したApp_Mainクラスで実行(run)します。
ページが必要とする引数やオブジェクトをこのハンドラで準備します。BEAR_Mainのオプションでインジェクトハンドラを切り替える事が可能です。
インジェクションハンドラで用意(注入)された変数やオブジェクトを使ってページ出力に必要な変数を準備します。 外部リソースを読み取り、リソースをset()メソッドでセットします。
onInit()ハンドラでsetされた値やリソースを出力します。 display()メソッドでSmartyを使用したHTMLページ出力になります。output('json')やoutput('excel')で出力するとそれぞれAJAX用JSONサービス、エクセルファイルダウンロードとなります。
※initハンドラでは出力はできません。echoや不用意なincludeで出力されたものはデバックモードでは破線に囲まれ開発確認用に出力されますが、ライブモードでは全てキャンセルされます。
フォームからsubmitされた値ががフォームバリデーションOKの場合のみコールされます。$submitで渡された値をつかってリソース操作(create, update, delete)をします。
ページに特定のイベントのハンドラを記述します。例えば記事一覧リソースを表示しているページがあったとして、特定の記事の「消去」リンクをクリックしたとき等にコールされます。
通常、リソースリクエストでリソース側で例外が発生しても(例えばDB接続失敗)ページには空のリソースオブジェクトが返るだけですが、その例外処理をページでしたい場合(ユーザー登録失敗など)にはこのハンドラを用意することで対処できます。 受け取った例外をハンドラ内でthrowして再度catchして例外を特定します。