2011-02-10 2 views
1

В основном я разрабатываю API с тортом, и я хотел бы добавить некоторый контроль версий в свой URL, чтобы упростить обновление API.CakePHP Route for API

Я не ищу какие-либо необычные маршруты на данный момент, просто, что маршрут

domain.com/api/1.9/:controller работает.

Мне нелегко заставить это работать. В настоящий момент работают простые запросы, но отправка запроса POST на domain.com/api/1.0/pictures/ завершается с ошибкой.

+0

Как вы определение ваших маршрутов? – Darren

+0

На данный момент только эти: Router :: connect ('/ api/1.0 /: controller /: action', array()); #RESTful маршрутизатор aan! Router :: mapResources ('ratings'); Router :: mapResources ('pictures'); Router :: parseExtensions ('xml', 'json'); – Ezra

+1

Выполняет ли отправку сообщения на 'domain.com/api/1.0/pictures (* Обратите внимание, что конечная слэш *) не работает? – joeb

ответ

4

Frank Mullenger имеет лучшее решение для версированной CakePHP API, что я нашел. Он опубликовал серию из трех частей, которая хорошо использует маршрутизацию Cake и некоторые пользовательские методы API.

First part (the problem with un-versioned APIs)

Second part (the solution for CakePHP)

Third part (error handling)

0

Вот мысль о том, что вы хотите, не используя умную маршрутизацию, но вам нужно немного изменить оставшийся URL-адрес вызова.

вместо

domain.com/api/1.0/pictures/$param1/$param2/$etc 

попробовать

domain.com/api/pictures/1.0/$param1/$param2/$etc 

затем в контроллере,

class Pictures extends controller { 
    .... 
    function pictures($ver , $param1, $param2, $etc) { 
    switch($ver) { 
     case '1.3': 
     $this->setAction('pictures_1-3', $param1, $param2, $etc); 
     break; 
     case '1.2': 
     $this->setAction('pictures_1-2', $param1, $param2, $etc); 
     break; 
     case '1.1': 
     default: 
     $this->setAction('pictures_1-1', $param1, $param2, $etc); 
     break; 
    } 
    } 

    function pictures_1-3() {} 
    function pictures_1-2() {} 
    function pictures_1-1() {} 
} 
+2

Кажется, что это добавило бы тонну ненужного кода вашим контроллерам. Не должно быть задачей какого-либо одного контроллера управлять несколькими API-интерфейсами. – joeb

+0

хорошо, это зависит от того, нужно ли вам параллельно поддерживать несколько версий API. Например, Direct3D API, существует функция Direct3DCreate9 для создания контекста рендеринга. Там также Direct3DCreate8, Direct3DCreate7, ... и т. Д. Они все еще работают. Если вы можете диктовать изменения API своим клиентам с большим ворчанием (ala Facebook), то это самый чистый способ. Если вам нужно одновременно поддерживать более одного, то это дубликат кода в контроллере. Если не контроллер, то модель. Это куда-то пойти. (Пожалуйста, бог нет IFFEF!): D – zeroSkillz

+0

@joeb: Вы можете легко создать общую форму этой функции и встроить ее в свой AppController. –