4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BEAR.SundayAdvent Calendar 2014

Day 3

リクエストとトランスファー

Last updated at Posted at 2014-12-02

アプリケーションはオブジェクトグラフの続きです。アプリケーションスクリプトを見ることでBEAR.Sundayの基本動作を解説します。

前回まで

1.オートローダーの登録

require dirname(__DIR__) . '/vendor/autoload.php';

2.アプリケーションインスタンスの生成

$app = (new Injector(new AppModule))->getInstance(AppInterface::class);

アプリケーションはスクリプトで利用するサービスを保持するだけのインスタンスです。

3.ルーター

$request = $app->router->match($GLOBALS);

スーパーグローバル変数からマッチした$requestを取得します。

4. リクエスト

ルーターでマッチした$requestのリクエストメソッド、リソースパス、クエリーでページリソースへのリクエストをつくります。

    $page = $app->resource
        ->{$request->method}         // 'get'
        ->uri($request->path)        // 'page://self/'
        ->withQuery($request->query) // []
        ->request();

上記のコードで作成されるのはリクエストです。

request()の前にeagerをつければリクエストではなく、リクエストを行った結果が返ります。

->request(); // リクエスト
->eager->request(); // リクエスト結果

リソースリクエストでページリソースは値を持ちます。

5.トランスファー

$page()->transfer($app->responder);

ページリソースのリクエストを行い、アプリケーションが持つレスポンダー($app->responder)を使ってクライアントに転送します。
(このデモはWeb用なのでheader関数でヘッダーを出力して、echoでコンテンツを出力しています。)

リクエストの処理中の例外はHTTPコードに準じたPHPの例外をキャッチして処理します。

アプリケーションの
「ページにリクエストが行われ、その表現結果が出力される」... アプリケーションスクリプトはこのHTTPリクエストの働きを単純に記述しています。

リソースクラス

HelloWorldアプリのページリソースクラスです。

<?php

namespace MyVendor\HelloWorld\Resource\Page;

use BEAR\Resource\ResourceObject;

class Index extends ResourceObject
{
    public function onGet($name = 'World')
    {
        $this->body['greeting'] = 'Hello ' . $name;

        return $this;
    }
}

GETメソッドの時に渡されたクエリー(?name=Name)を使い、自身のコンテンツ($this->body)を返しています。クエリーがついていないときはWorldが使われます。

ルーターからディスパッチされて呼ばれる箇所でMVCフレームワークでいうとコントローラーに当たる箇所なのですがこれもリソースです。

  • リクエストオブジェクトを利用していない
  • リクエストメソッドを判別していない
  • 出力に対して無関心(出力を行っていない)
  • 責任を持つのは出力ではなく自身の構成

コントローラーと違うのはこんなところでしょうか。

他のリソースを扱う事もできるのでコントローラーとしての側面もありますが、そのドメインだけを取り扱うという点ではモデルのようでもあります。また実際そのまま出力できるのでレスポンスオブジェクトのようになものとも言えます。

Object as a service

リソースクラスは統一されたメソッドを持ちPHP標準の順序順の引数ではなく名前付き引数で呼ばれます。コードヘッダーボディ(コンテンツ)の公開された(public)プロパティを持ちPHPのクラスとRESTのリソースが融合しています。

リソースオブジェクトはサービスとして振舞います。アクセスするには通常のPHPシンタックスではなく、アプリケーションスクリプトでリクエストの時に使ったリソースクライアントを使ってアクセスします。

  • 統一されたメソッド
  • URI
  • クエリー(名前付き引数)
  • ステートレス

BEAR.Sundayのアプリケーションはこれらの極小のPHPのサービスを提供するリソースの集合です。

まとめ

  • アプリケーションスクリプトは起動から終了までの動作(ページがリクエストされその表現が転送されること)が記述されています。
  • アプリケーションスクリプトにはMVCという3つのコンポーネントではなく、リソースというコンポーネントだけが登場しています。
  • リソースはPHPのオブジェクトですがWebサービスのように振舞います。
  • アプリケーションはリソースの集合です。
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?