2016-04-15 2 views
2

Я работаю с API, который отображает json-формат в Cakephp. В AppController.php у меня есть:Как прекратить продолжение в prefilter без продолжения основного контроллера?

public function beforeFilter() { 
    $this->RequestHandler->renderAs($this, 'json'); 

    if($this->checkValid()) { 
    $this->displayError(); 
    } 
} 
public function displayError() { 
    $this->set([ 
    'result'  => "error", 
    '_serialize' => 'result', 
    ]); 
    $this->response->send(); 
    $this->_stop(); 
} 

Но это ничего не отображается. Хотя, если он работает нормально без остановки и отображения с:

$this->set([ 
'result'  => "error", 
'_serialize' => 'result', 
]); 

отображается хорошо.

+0

Я где-то читал, что вы нужно отобразить представление перед выходом, чтобы показать ответ, но не уверен. –

+1

beforeFilter не остановит действие контроллера, которое вы запускаете, вы можете попробовать $ this-> autoRender = false; который должен остановить действие вашего контроллера, автоматически отображая представление. – HelloSpeakman

+0

Вижу, спасибо @HelloSpeakman. Есть ли способ перенаправить на другой контроллер без изменения URL-адреса? – ralphjason

ответ

1

Я бы посмотрел на использование Исключений с помощью специального json exceptionRenderer.

if($this->checkValid()) { 
    throw new BadRequestException('invalid request'); 
} 

добавить обработчик исключений, включив это в приложение/Config/bootstrap.php:

/** 
* Custom Exception Handler 
*/ 
App::uses('AppExceptionHandler', 'Lib'); 

Configure::write('Exception.handler', 'AppExceptionHandler::handleException'); 

затем создать новый обработчик исключений в вашем app/Lib папку с именем AppExceptionHandler.php

это файл может выглядеть примерно так:

<?php 

App::uses('CakeResponse', 'Network'); 
App::uses('Controller', 'Controller'); 

class AppExceptionHandler 
{ 

    /* 
    * @return json A json string of the error. 
    */ 
    public static function handleException($exception) 
    { 
     $response = new CakeResponse(); 
     $response->statusCode($exception->getCode()); 
     $response->type('json'); 
     $response->send(); 
     echo json_encode(array(
      'status' => 'error', 
      'code' => $exception->getCode(), 
      'data' => array(
       'message' => $exception->getMessage() 
      ) 
     )); 
    } 
} 
+0

Спасибо! Я подумаю об этом. – ralphjason

Смежные вопросы