2013-03-06 3 views
1

Я пытаюсь использовать AbstractRestfulController. Я создаю класс контроллера:Как обрабатывать ошибки (AbstractRestfulController)?

class MyController extends AbstractRestfulController{ 

    public function getList(){ 
     $data = array(); 

     return new JsonModel(array(
      'data' => $data, 
     )); 
    } 

    public function get($id){ 
     $data = array(); 

     return new JsonModel(array(
      'data' => $data, 
     )); 
    } 

    public function create($data){ 
     $data = array(); 

     return new JsonModel(array(
      'data' => $data, 
     )); 
    } 

    public function update($id, $data){ 
     $data = array(); 

     return new JsonModel(array(
      'data' => $data, 
     )); 
    } 

    public function delete($id){ 
     $data = array(); 

     return new JsonModel(array(
      'data' => $data, 
     )); 
    } 

} 

и маршрутизация:

return array(
    'router' => array(
     'routes' => array(
      'mylink' => array(
       'type' => 'Segment', 
       'options' => array(
        'route' => '/mylink[/:id]', 
        'constraints' => array(
         'id'  => '[0-9]+', 
        ), 
        'defaults' => array(
         'controller' => 'MyModule\Controller\My', 
        ), 
       ), 
      ), 
     ), 
    ), 
    'controllers' => array(
     'invokables' => array(
      'MyModule\Controller\My' => 'MyModule\Controller\MyController', 
     ), 
    ), 
    'view_manager' => array(
     'strategies' => array(
      'ViewJsonStrategy', 
     ), 
    ), 
); 

но что происходит, когда пользователь вызывает неправильный метод или неправильный идентификатор или что-нибудь еще? Я бы хотел сам справиться с этим. Как это сделать?

ответ

3

Ваш api должен по-прежнему возвращать ответ в запрошенном формате (json, xml и т. Д.), Как правило, с некоторым кодом ошибки/сообщением, описывающим проблему, и соответствующим кодом ответа HTTP. Вам решать рассказать потребителям вашего api, какими будут ожидаемые ответы, но им решать, когда они ошибаются.

С этой точки зрения это простой случай настройки ответа и заселением модели с соответствующей информацией, чтобы вернуться, типичный ответ может выглядеть следующим образом ...

public function get($id) 
{ 
    // some processing to find id ... 

    // no id found 
    if (!$found) { 
     // set 404 Not Found response 
     $this->getResponse()->setStatusCode(404); 
     // return message to client 
     return new JsonModel(array(
      'error' => 404, 
      'reason' => sprint_f('Requested id "%s" not found', $id'), 
     )); 
    } 
} 

Очевидно сделать то же самое для других методы и попытайтесь использовать подходящий HTTP response code

+0

Но что, если есть плохой URL? Если я установил 'error/404' в 'template_map', он вернет мне стандартную текстовую/html-страницу из представления/ошибки. Я не могу назначить контроллер/модуль/все, чтобы обрабатывать ошибки? – Nips

+1

Это не то, что вы просили. Для плохого URL-адреса вам стоит больше подумать, как ваш сайт также обслуживает стандартные страницы http? Если нет, вы можете создать стратегию просмотра 404, которая возвращает JsonModel в случае 404 ответа от маршрута. Если он также обрабатывает http, вам придется придумать стратегию, которая может определить, является ли это плохим апи-запросом или реальным пользователем, который ошибочно подключил ссылку. Я думаю, вам нужно подумать о том, что приемлемо, как я уже сказал, это не ваша ответственность за обработку ошибок ваших клиентов. То, что они получили 404 вместе с html вместо ответа json, должно быть достаточно. – Crisp

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