2013-12-15 2 views
2

Работает над созданием API и хотел бы использовать RESTful routes.Использовать префикс маршрута с маршрутами RESTful в CakePHP

я получил его работать нормально, как это:

http://www.mysite.com/events.json // returns json results with my events 
http://www.mysite.com/events/123.json // returns json results with event of id '123' 

НО - я хочу, чтобы быть в состоянии сделать это, используя префикс «API».

Итак, я добавил апи маршрутизации префикс:

Configure::write('Routing.prefixes', array('admin', 'api')); 

И изменил свои действия с «точки зрения» и «индекс» к «api_view» и «api_index».

Но теперь это не сработает. (Напр., Я должен написать имя действия или он не найдет правильный, основанный на HTTP

Конечная цель была бы быть в состоянии сделать что-то вроде этого:.

GET http://www.mysite.com/api/1.0/events.json // loads events/api_index() 
GET http://www.mysite.com/api/1.0/events/123.json // loads events/api_view($id) 
DELETE http://www.mysite.com/api/1.0/events/123.json // loads events/api_delete($id) 
...etc 

ответ

0

попробовать что-то как это.

Router::connect('/:api/:apiVersion/:controller/:action/*', 
    array(), 
    array(
     'api' => 'api', 
     'apiVersion' => '1.0|1.1|' 
    ) 
); 

С префиксом маршрутизации

Router::connect('/:prefix/:apiVersion/:controller/:action/*', 
    array(), 
    array(
     'prefix' => 'api', 
     'apiVersion' => '1.0|1.1|' 
    ) 
); 

будет соответствовать только действительные версии API, как 1. 0 и 1.1. Если вы хотите, чтобы что-то еще использовало регулярное выражение.

+0

Я могу управлять маршрутизатором просто отлично - проблема также позволяет REST определять, должен ли он отображать «вид» или «индекс» ... и т. Д. На основе типа HTTP. – Dave

+0

Объявить маршруты и использовать [метод] во втором массиве аргументов. Как показано здесь http://book.cakephp.org/2.0/en/development/routing.html#using-additional-conditions-when-matching-routes См. Также https://github.com/kvz/cakephp-rest- plugin – burzum

+0

Я думаю, что получаю это - постараюсь утром. Благодарю. – Dave

2

Я закончил тем, что просто написать маршруты вручную:

Router::parseExtensions('json', 'xml'); 

Router::connect('/api/:version/:controller/:id/*', 
array('[method]'=>'GET', 'prefix'=>'api', 'action'=>'view'), 
array('version'=>'[0-9]+\.[0-9]+', 'id'=>'[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}')); 

Router::connect('/api/:version/:controller/*', 
array('[method]'=>'GET', 'prefix'=>'api', 'action'=>'index'), 
array('version'=>'[0-9]+\.[0-9]+')); 

Router::connect('/api/*', array('controller'=>'events', 'action'=>'index', 'ext'=>'html')); 

Примечания:

[method] является то, что заставляет тип HTTP (например, RESTful.)

parseExtensions() делает так, чтобы вы могли автоматически отображать данные в разных форматах, меняя exte в вашем URL-адресе.

Последняя строка Router :: была просто захватывающей для чего-либо/api /, которая не совпала - она ​​отправила ее на главную страницу. В конце концов, я, вероятно, просто отправлю это на страницу с ошибкой API.

'ext'=>'html' последней строки Router :: должен был содержать parseExtensions от попыток использовать любое расширение в URL-адресе - если он перенаправляется по причинам, по которым они сделали неправильный вызов, я просто хочу, чтобы он вернулся на домашнюю страницу (или что-то еще) и использовать обычное представление.

0

Я знаю, что это старый пост, но есть метод маршрутизации, называемый mapResources, который создает для вас специальную маршрутизацию.

http://book.cakephp.org/2.0/en/development/rest.html

Вы кладете его в routes.php так:

Router::mapResources(array('controller1', 'controller2')); 

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

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