2011-01-14 2 views
1

Итак, позвольте мне объяснить, что я пытаюсь сделать.CakePHP и параметры обработки в REST

Я успешно реализован сервис SOAP с CakePHP, используя этот учебник:

http://bakery.cakephp.org/articles/Marcelius/2009/02/10/soap-services-in-cakephp

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

Что я хочу иметь, это то же приложение, которое также может обрабатывать запросы через REST. До сих пор мне удалось добавить mapResources() и parseExtentions() в мой файл route.php, и он отлично работает для функций, для которых не требуются какие-либо параметры для правильной работы, то есть я могу перейти к URL-адресу как

локальный/каталог/controller_name/function_name.xml

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

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

Я читал о том, как вы можете использовать file_get_contents ("php: // input") для извлечения и анализа тела входящего запроса, но это действительно не работает слишком хорошо, потому что мне нужно вернуться и измените весь мой существующий код на выборку из этого источника, и каждый вызов функции выдает предупреждение о отсутствующих параметрах.

Является ли то, что я пытаюсь сделать возможным? Каким будет лучший способ справиться с этой ситуацией с CakePHP?

ТИА

ответ

0

Вид ответил мой собственный вопрос сегодня, после борьбы за какое-то время ...

Я закончил тем, передавая параметры функции через GET, но это по-прежнему требуется, чтобы они были переданы непосредственно в контроллер функционирует как stdClass, так как классы SOAP PHP обрабатывают параметры, так что это то, что ожидает существующий код. Я был в состоянии сделать пользовательский класс cakeroute который выглядит следующим образом:

class GetRestParamRoute extends CakeRoute { 
function parse($url) { 
    $params = parent::parse($url); 

    if(count($_GET) > 1){ 


     $obj = new stdClass(); 
     foreach($_GET as $get_var_name => $get_var_value){ 

      if($get_var_name == "url") continue; 

      $obj->$get_var_name = $get_var_value; 
     } 


     $params['pass'][] = $obj; 
    } 

    return $params; 
} 

А потом в routes.php

 App::import('Lib', 'routes/GetRestParamRoute'); 
    Router::connect('/:controller/:action', array(), 
      array('routeClass' => 'GetRestParamRoute')); 

Так что же происходит в том, что все запросы URL передаются в пользовательский класс маршрута , который, в свою очередь, рассматривает переменные GET, и если они не являются самим URL-адресом, они добавляются как члены в stdclass, который затем добавляется к переданным переменным параметра и передается в функцию контроллера при ее вызове. Затем я обрабатываются ответ, как торт книги объявляет «простую настройку», т.е. добавили это мой routes.php

 Router::mapResources("myController"); 
    Router::parseExtensions('xml'); 

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

2

Лучшим способом получить параметры от произвольного запроса было бы использование условных обозначений в стиле торта для получения параметров. Вы можете получить доступ к $this->params['url'] из своего контроллера вместо использования суперглобального массива $_GET.

http://localhost/CAKE_DIR/profilePhotos.json?param1=123&param2=456

$this->params['url'] разорвет URL и параметры вверх следующим образом:

{"ext":"json","url":"profilePhotos.json","param1":"123","param2":"456"}

+0

В нормальных условиях это, как нормальный человек будет делать это. Но в этом случае это не работает. Существующий код установлен для обработки запросов мыла, поэтому любая функция контроллера с параметрами ожидает только один stdClass в качестве входных данных. Если бы я сделал это по-своему, мне пришлось бы вернуться и изменить ВСЕ мой существующий код, чтобы вручную захватить все переменные из $ this-> param ['url'], а не просто определять маршрут, а также сопоставлять подпись функции. – user470714

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