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

Владимир | | PHP, Web разработка, Yii.

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 – описания ошибок, если они были.

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

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

Постовой

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

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

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

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

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

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

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

  • necros

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

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

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

  • necros

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

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

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

  • Zi

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

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

      • Zi

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

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

      • Владимир

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

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

  • Zi

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

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

      • Zi

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

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

      • Владимир

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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