Service

Serviceを使うと、POSTメソッドに対応するルーティングと処理をまとめて定義できます。

Serviceの利点

  • グループ化、抽象化ができる
  • beforeメソッドで共通処理ができる
  • エラー出力
  • JSON APIが開発できる
  • Hookが使える

基本テンプレート

service("object", function($s){
  $s->before(function($post, $method)use($s){
    $object = get_method($post);
    return $object;
  });

  $s->receive("edit", function($post, $object)use($s){
    update_method($object, $post);
    $s->redirect("");
  });

  $s->receive("delete", function($post, $object)use($s){
    $object->delete();
    $s->redirect("");
  });
});

下記のルーティングが定義されます。

post("/object/edit", function(){...});
post("/object/delete", function(){...});

実際のコード例

pachira/app/services/article.php

<?php

namespace Article;

service("article", function($s){
  $s->before(function($post, $method)use($s){
    $article = Article::load(el($post, "id"));
    if(!$article){
      if($method === "upsert"){
        $article = new Article();
      }else{
        $s->error("article does not exist");
      }
    }

    // beforeの戻り値は、以下ルーティングの第2引数に渡される
    return $article;
  });

  $s->receive("upsert", function($post, $article)use($s){
    $article->name = el($post, "name");
    $article->contents = el($post, "contents");
    if(validate_article($artilce)) $s->error("error");

    $article->save();
    $s->redirect("");
  });

  $s->receive("delete", function($post, $article){
    $article->delete();
    $s->redirect("");
  });
});

下記のルーティングが定義されます。

post("/article/upsert", function(){...});
post("/article/delete", function(){...});

$s->view($name, $args=[])

$s->redirect($path)

$s->error($errors, $view="error")

view($view, ["errors" => $errors]); が呼ばれます。

$s->json($data)

未実装