XML-RPC и Yii фреймворк

21 марта, 2010
yii xml rpc

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

Но, как оказалось, этот недостаток несложно исправить. Рассмотрим небольшой пример, получение нескольких записей из блога на движке WordPress с помощью XML-RPC запроса.

Шаг 1. Загружаем библиотеку для работы с XML-RPC.

Для этого примера я выбрал Incutio XML-RPC Library, главным образом потому, что её использует WP. Но, в принципе, это не важно. Возможно, вам больше понравится библиотека из ZF.

Загружаем библиотеку и сохраняем её в папке protected/vendors фреймворка (эту папку нужно создать). В данном случае библиотека состоит всего из одного файла IXR_Library.php.

Примечание. Учитывая, что библиотека маленькая, можно было её сохранить и в папке, protected/extensions, но, насколько я понял из официального руководства, данная папка предназначена для собственных расширений. Поэтому не будем путать их со сторонними разработками. Хотя разницы в подключении практически никакой.

Шаг 2. Подключаем библиотеку к фреймворку.

Тут есть нюансы. Если бы в нашей библиотеке каждый класс был объявлен в отдельном файле, и имя этого класса совпадало бы с именем файла, то можно было бы обойтись только методом Yii::import. Но в данном случае это не так, потому подключение выполняется следующим образом.

Yii::import('application.vendors.*');
require_once ('IXR_Library.php');

Метод import позволяет изменить относительный путь подключения PHP скриптов (используется функция set_include_path). application.vendors.* означает, что будут подключены все файлы, находящиеся в папке protected/vendors. Но, по-умолчанию, само подключение будет выполнено только при первом использовании классов.

Поэтому нам нужно сразу после вызова import использовать require_once. Иначе фреймворк будет пытаться найти файлы для каждого из классов библиотеки, а они все находятся в IXR_Library.php.

Если бы мы поместили библиотеку в папку protected/extensions, то изменился бы только путь подключения.

Yii::import('ext.*');
require_once ('IXR_Library.php');

Шаг 3. Использование.

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

Для нашего примера код будет такой.

$client = new IXR_Client('http://my_cool_wp_blog.com/xmlrpc.php');

$requestData[0] = 0; //id блога
$requestData[1] = 'user_name']; //имя пользователя
$requestData[2] = 'user_pass'; //пароль
$requestData[3] = 5; // количество записей, которые нужно получить

if (!$client->query('metaWeblog.getRecentPosts', $requestData)) {
	throw new Exception('Get posts error: '.$client->getErrorMessage());
}

$data = $client->getResponse();

В данном случае я использовал MetaWeblog API. В конструкторе объекта IXR_Client указываем адрес XML-RPC сервера (для блогов на WP это файл xmlrpc.php, который находится в корне блога).

Затем формируем массив с параметрами и отправляем запрос с помощью метода query. В его первом параметре указываем имя функции, в данном случае это metaWeblog.getRecentPosts, которая возвращает список последних постов, а во втором – массив с параметрами.

Метод getResponse возвращает массив с результатами запроса, а getErrorMessage – описания ошибок, если они были.

Как видите, фреймворк позволяет подключить практически любую библиотеку и использовать её так, как описано в документации.

Если есть вопросы, советы или замечания, пишите, буду рад обсудить ;)

Постовой

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

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в PHP, Web разработка, Yii Комментарии (34) »

]]>

Вы можете оставить комментарий. Трекбеки закрыты.

  • http://aktuba.ru/ aktuba

    Жаль, что сменил CI на Yii… Yii мне не понравился, использую CI и KO3.

    • http://www.simplecoding.org/ Владимир

      Я не могу сказать, что я сменил фреймворк. Просто начал использовать Yii :) CI практически не развивается, а в Yii много интересных возможностей.

  • http://aktuba.ru aktuba

    Жаль, что сменил CI на Yii… Yii мне не понравился, использую CI и KO3.

    • http://www.simplecoding.org/ Владимир

      Я не могу сказать, что я сменил фреймворк. Просто начал использовать Yii :) CI практически не развивается, а в Yii много интересных возможностей.

  • http://blog.bethrezen.ru/ Bethrezen

    IXR имеет косяк кстати. Везде, где fgets($fp, 4096); лучше заменить на fgets($fp);, а то будут проблемы с некоторыми сервисами =)

    • http://www.simplecoding.org/ Владимир

      Спасибо, учту.

  • http://blog.bethrezen.ru Bethrezen

    IXR имеет косяк кстати. Везде, где fgets($fp, 4096); лучше заменить на fgets($fp);, а то будут проблемы с некоторыми сервисами =)

    • http://www.simplecoding.org/ Владимир

      Спасибо, учту.

  • necros

    Поэтому нам нужно сразу после вызова import использовать require_once.

    Более правильно – использовать всё тот же импорт, но вот так:
    Yii::import('application.vendors.IXR_Library', true);

    • http://www.simplecoding.org/ Владимир

      Спасибо! Я не обратил внимания на эту возможность.

  • necros

    Поэтому нам нужно сразу после вызова import использовать require_once.

    Более правильно – использовать всё тот же импорт, но вот так:
    Yii::import('application.vendors.IXR_Library', true);

    • http://www.simplecoding.org/ Владимир

      Спасибо! Я не обратил внимания на эту возможность.

  • Zi

    А где описание того как сервер замутить? :)

    • http://www.simplecoding.org/ Владимир

      На самом деле это несложно. Главное, хороший пример придумать (небольшой, иначе в рамки статьи не уложится, но максимально приближенный к реальности). Если есть идеи, я слушаю :)

      • Zi

        Ну, например, калькулятор :)

        • http://www.simplecoding.org/ Владимир

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

      • Владимир

        Например, генератор форм. Можно, наверное, переделать http://www.simplecoding.org/formgenerator/

        • http://www.simplecoding.org/ Владимир

          Интересное предложение, я подумаю.

  • Zi

    А где описание того как сервер замутить? :)

    • http://www.simplecoding.org/ Владимир

      На самом деле это несложно. Главное, хороший пример придумать (небольшой, иначе в рамки статьи не уложится, но максимально приближенный к реальности). Если есть идеи, я слушаю :)

      • Zi

        Ну, например, калькулятор :)

        • http://www.simplecoding.org/ Владимир

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

      • Владимир

        Например, генератор форм. Можно, наверное, переделать http://www.simplecoding.org/formgenerator/

        • http://www.simplecoding.org/ Владимир

          Интересное предложение, я подумаю.

  • http://news.onru.ru/ Dolober

    А зачем вообще нужен XML-RPC? Для работы Blogger? Для RSS лент?

    • http://www.simplecoding.org/ Владимир

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

  • http://news.onru.ru/ Dolober

    А зачем вообще нужен XML-RPC? Для работы Blogger? Для RSS лент?

    • http://www.simplecoding.org/ Владимир

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

  • http://www.simplecoding.org/xml-rpc-i-yii-frejmvork.html Jenya

    Здравствуйте очень интересно мне помогло

  • http://www.simplecoding.org/xml-rpc-i-yii-frejmvork.html Jenya

    Здравствуйте очень интересно мне помогло

  • http://twitter.com/theBuCeFaL Denis Medved

    Хотелось отдельную статью про XML-RPC и SOAP.
    Спасибо =)

  • http://www.nayjest.ru/ Nayjest (Виталий Степаненко)

    Да нет, ничего удивительного.
    Зачем Yii XML-RPC, если там весьма просто и элегантно реализовано логическое развитие XML-RPC — SOAP? :)
    В документации есть исчерпывающий и очень лаконичный пример реализации веб-сериса на базе SOAP:
    http://www.yiiframework.com/doc/guide/ru/topics.webservice

  • http://www.nayjest.ru/ Nayjest (Виталий Степаненко)

    Ну, я это о том, что стоило бы упомянуть в статье о существующей реализации ядра SOAP-веб-сервисов в Yii

  • http://www.simplecoding.org Владимир

    Поддержка XML-RPC нужна, т.к. иногда приходится работать со сторонними XML-RPC серверами. Хотя, учитывая, что к Yii можно легко подключить сторонние библиотеки, это не проблема.

    SOAP может быть и логическое развитие, но XML-RPC проще, требует меньше времени на изучение, широко используется. И не всем проектам нужны все возможности SOAP.

    Не поймите неправильно, я не против SOAP, но, думаю, он не вытеснит XML-RPC, они просто будут сосуществовать.

    P.S. А пожелание я учту :)

]]>
Tweet