November 4, 2012

FuelPHPのController_RestとPUT/DELETEとPHPの標準入力についてメモ

2013/05/19 追記:
実はv1.2の頃から Input::json() メソッドがあり、backbone.js(JSON通信)については、それを使えば良いっぽいです。Input::json() の使い方は Input::post() とかの使い方と同じなはずです。

--

backbone.jsを使っていて、当問題に出くわしました。

PHPの標準入力は
http://php.net/manual/ja/wrappers.php.php
"php://input でオープンしたストリームは、一度しか読み込めません。"
との事です。

Controller_RestでPUT/DELETEの時
* Controller_Rest::_detect_format
* Input::param
* Input::hydrate
と進んで、Input::hydrateでfile_get_contents('php://input')しているようです。

そのためか、Controller_Restを継承したサブクラスのメソッド(put_xxx/delete_xxx)で
file_get_contents('php://input')しても、内容は読み込めませんでした。

Input::put/Input::deleteで取れなくは無いのですが、試しにInput::putをログ出力してみると
--
Array
(
    [{"id":"xxx","name":"yyy"}] =>
)
--
という、奇妙な形に。。。

至急、解決したかったので、Inputクラスをapp側で拡張、置換。
以下のメソッドを実装して、凌ぐことにしました。
public static function php_input()
{
    static::$php_input === null and static::$php_input = file_get_contents('php://input');
    return static::$php_input;
}
とりあえず、以下の形で取得できました。
--
{"id":"xxx","name":"yyy"}
--

No comments:

Post a Comment