Extrollerアドオン(コントローラ拡張) | Addons

Sabelは「初期状態はシンプルに」のもと開発されているため、その代償としてコーディング量が多くなってしまうということがあります。例えばコントローラ(アクション)内でリクエスト値を受け取るところです。
public function myAction()
{
  $name = $this->request->fetchPostValue("name");  // $_POST["name"]
  $age  = $this->request->fetchPostValue("age");   // $_POST["age"]
}
といっても $_POST など使用する場合でも面倒と言えば面倒ではありますが...
public function myAction()
{
  $name = (isset($_POST["name"])) ? $_POST["name"] : null;
  $age  = (isset($_POST["age"]))  ? $_POST["age"] : null;
}
Extrollerアドオン を使うとこのようなコーディングの手間から解放されます。Extrollerアドオン は GET, POST, URLパラメータ(ルーティング設定を参照)をコントローラ内で $this でアクセス可能にしてくれます。
public function myAction()
{
  $name = $this->name;
  $age  = $this->age;
}
同じように各リクエスト値を配列で受け取るのも簡単です。通常の取得と同様、配列の中身の値が空の場合は NULL となっています。
public function myAction()
{
  $gets  = $this->GET_VARS;
  $posts = $this->POST_VARS;
}
URL: http://www.example.com/xxx/myAction?a=&b[]=&b[]=

public function myAction()
{
  $gets = $this->GET_VARS;
  
  $gets["a"];     // NULL
  $gets["b"][0];  // NULL
  $gets["b"][1];  // NULL
}
GETやPOSTなどの各リクエスト値のキーが重複すると、エラー(400 BAD REQUEST)となります。異なるHTTPメソッドで同じキーを使用しないようにしてください。

また、Extrollerアドオンはアクションのコメントをアノテーションとして利用し多くの便利な機能を提供します。例えば @httpMethod を使用すると、そこに記述されていないHTTPメソッドによるアクセスは拒否(405 METHOD NOT ALLOWED)します。
/**
 * @httpMethod post
 */
public function myAction()
{
  // POST時しか実行されない
}
リクエスト値をtrimしてくれる @trim もあります。半角スペース、全角スペース、改行をtrimします。
/**
 * @httpMethod post
 * @trim title body
 */
public function myAction()
{
  // trim済み
  $title = $this->title;
  $body  = $this->body;
}
また @checkを使用するとリクエスト値のバリデーションを行うこともできます。下記は、タイトル必須・全角32文字以内、本文必須のバリデーションです。
/**
 * @httpMethod post
 * @trim title body
 * @check title:タイトル required strwidth(64)
 * @check body:本文 required
 */
public function myAction()
{
  if ($this->validator->hasError()) {
    dump($this->validator->getErrors());
  }
}
この @checkは、バリデータのセットアップをアノテーションで行うというものです。バリデーションに関する詳細はこちらを参照してください。

バリデーションメソッドの引数には定数やクラス定数を使用することも可能です。
@check title:タイトル required strwidth(Diary::TITLE_MAX_WIDTH)
なお、HTTPメソッドがGETの時にバリデーションに失敗するとアクションは実行されません(400 BAD REQUEST)。なのでGETでリクエストされるアクションで、必須のパラメータなどがある場合は積極的に利用すると良いでしょう。
/**
 * @httpMethod get
 * @check id required nnumber
 */
public function myAction()
{
  $id = $this->id;  // NULLではなく、整数(自然数)であることが保証されている。
}
また、ExtrollerアドオンをロードするとHTTPステータスの設定に関する長いコードからも解放されます。
public function myAction()
{
  $this->response->getStatus()->setCode(Sabel_Response::BAD_REQUEST);
  $this->response->getStatus()->setCode(Sabel_Response::NOT_FOUND);
  $this->response->getStatus()->setCode(Sabel_Response::FORBIDDEN);
  $this->response->getStatus()->setCode(Sabel_Response::INTERNAL_SERVER_ERROR);
  
  // 上記のコードがこう書ける
  $this->badRequest();
  $this->notFound();
  $this->forbidden();
  $this->serverError();
}