11765


CakePHP1.3でAPIの開発しています。  
ビューには下記のようにjson_encodeが1行書かれているのみです。

[code]

     echo json_encode($result);
    
[/code]

すべてのAPIビューは同じ内容を書くので、ビューファイルを共通化したいと考えました。  
アクションにrender()を書くとビューファイルを共通化できました。

[code]

    $this->render(null, null, VIEWS . "api.json");
    
[/code]

しかし、これでは全てのアクションに上記の記述を書かなければなりません。  
そこで、app_controller.phpなどにビューの指定をまとめて記述する方法があるかを教えていただきたいです。

よろしくお願いいたします。


CC BY-SA 3.0
2015-06-25T07:55:16.190
11714
2015-06-26T06:20:36.310
4098
question
php cakephp
CakePHP1.3でビューを共通化する方法を教えて下さい。


アクション毎に特別な設定を行わずAppController等で共通化するのであれば、次の2つのやり方が考えられます。

  1. 2.x系のJsonViewを移植し、`AppController::beforeFilter()`でビュークラスを切り替える。
  2. `AppController::beforeRender()`で、レンダリングを行い終了させる。

1の方が望ましいと考えますが、ここではより簡易にできる2の方法を示します。

`app/config/routes.php`に追加

[code]

    Router::parseExtensions();
    
[/code]

`app/app_controller.php`

[code]

    <?php
    class AppController extends Controller {
        public $components = array('RequestHandler', // ... (他にあれば追記) );
    
        // (...snip...)
    
        public function beforeRender() {
            if ($this->RequestHandler->ext === 'json') {
                // リクエストされたURLの拡張子がjsonであれば
                Configure::write('debug', 0);
                // レンダリング
                $this->RequestHandler->respondAs('json');
                $View = new View($this);
                echo $View->render('/json/default');
                // 終了処理
                $this->_stop();
            }
        }
    
        // (...snip...)
    
    }
    
[/code]

`app/view/json/default.ctp`

[code]

    <?php
    echo json_encode($result, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
    
[/code]

これで、`/foo/bar.json`
のようなURLでアクセスされた場合に、`app/view/json/default.ctp`でレンダリングされるようになります。


CC BY-SA 3.0
2015-06-26T06:20:36.310
11765
2015-06-26T06:20:36.310
2668
11714
answer