CakePHP и параметры обработки в REST - PullRequest
1 голос
/ 14 января 2011

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

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

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

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

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

localhost / directory / controller_name / имя_функции.xml

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

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

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

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

ТИА

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Лучшим способом получения параметров из произвольного запроса было бы использование соглашений типа торта для получения параметров.Вы можете получить доступ к $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 голосов
/ 15 января 2011

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

Я закончил тем, что передавал параметры функции через GET, но это все еще требовало, чтобы они передавались непосредственно в функции контроллера какstdClass, так как именно так PHP-классы SOAP обрабатывают параметры, именно этого ожидает существующий код.Мне удалось создать пользовательский класс 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;
}

А затем в rout.php

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

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

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

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

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