0

Cakephp 3.1コントローラー関数からjsonを返そうとしています。私の問題は、_serialize フラグを使用して何をしても、ビュー テンプレート ファイルが見つからないという応答が常に返されることです。

Cake のドキュメントでは、テンプレートを使用して応答をフォーマットする必要がない場合は、_serialize フラグを設定するように指示されています。View _serializeのCake Docs

以下は、プロセスを初期化するクライアント側の Javascript です。

    function save_activity( mod, act, resp ) {

    $.ajax({
            method: 'POST', 
            url: '/activities/saveActivity', 
            data: { 
                'module' : "example1",
                'activity_name' : "example2",
                'response' : "example3"
            },
            dataType: 'json', 
            error: function( xhr, status, error ){
                alert( status + error );
            },
               success: function( data, status,  xhr ){
                   alert( status + data.success );
            }
});
}

クライアントからの json を処理するコントローラー コード。

public function saveActivity()
    {
        $user = $this->Auth->user();

        //This line does not seem to do anything
        //$this->request->input('json_decode', 'true');

        //Debugger::log($this->request->data);

        $activityTable = TableRegistry::get('Activities');
        $activity = $activityTable->newEntity();

        $activity->user_id = $user['id'];
        $activity->module = $this->request->data('module');
        $activity->activity_name = $this->request->data('activity_name');
        $activity->response = $this->request->data('response');

        //These lines do not have any effect
        //$this->RequestHandler->renderAs($this, 'json');
        //$this->response->type('application/json');
        //$this->viewBuilder()->layout(null);
        //$this->render(false);

        $msg = '';
        if ($activityTable->save($activity)) {
            $msg = 'Activity Stored';
        } else {
            $msg = 'Activity Not Stored';
        }

        $this->set(['response' => $msg]);

       //comment or uncomment this line and it makes no difference
       //as it still returns a json response about a missing template.
       $this->set('_serialize', true);

    }

_serialize フラグを含めたり削除したりすると表示されるエラー メッセージ。

「テンプレート ファイル "Pages\json\module1\activity4.ctp" が見つかりません。」

誰でもこのメカニズムについて洞察を持っていますか? 私が見つけた回避策は、テンプレート ファイルを含めることですが、これは、この呼び出しが生成されるすべての場所を処理するために、本質的に空のテンプレート ファイルを数十個生成する必要があることを意味します。

何か助けてください。

4

1 に答える 1

1

問題の原因:- 仮定の違反。

私の仮定は、saveActivity メソッドが実行されているということでした。実際には、AuthComponent がそのメソッドへのアクセスを許可できず、代わりにデフォルトのハンドラが実行されていましたが、デフォルトのビュー テンプレートが検索され、失敗していました。

これは、devTools を介して返されたページのエラー メッセージに添付されたスタック トラックを調べて見つけました。また、いくつかの単純なトレース ロギング呼び出しを使用して、この仮定を検証する必要がありました。「$this->set('_serialize', true);」をコメントアウトしたとき、私はすでに手掛かりを持っていました。そして何も変わっていません。

次に、単純な解決策は、コントローラーの beforeFilter でメソッドを承認することでした。

  public function beforeFilter(Event $event)
    {
        parent::beforeFilter($event);

        $this->Auth->allow('saveActivity');
        $this->Auth->allow('getActivity');

        $this->eventManager()->off($this->Csrf);
    }

助けてくれてありがとう。

于 2016-02-06T01:00:37.383 に答える