Pull to refresh

Разработка приложений на AMFPHP

Reading time4 min
Views6.9K
Как это ни странно, на просторах бескрайнего интернета я не нашёл ни одного полноценного мануала (во всяком случае русского) по разработке приложений на AMFPHP. Примерно год назад подобного рода статья была мне очень нужна, но за неимением таковой пришлось собирать все по крупинкам из разных источников. Надеюсь, она будет кому-то полезна.

AMF


Итак, что же такое AMF? Не будем изобретать словесный велосипед и обратимся за помощью к вике:

AMF (англ. Action Message Format, формат сообщений о действиях) — бинарный формат обмена данными, использующийся в приложениях, написанных на Action Script. Построен на основе протокола Simple Object Access Protocol и используется, преимущественно, для обмена информацией между Adobe Flash и базами данных. Action Message Format более экономичен по трафику по сравнению с XML и позволяет передавать типизированные объекты. Анонсирован 13 декабря 2007 года

На данный момент AMF является самым актуальным форматом передачи данных между флеш-приложением и серверной частью. Библиотеки для работы с AMF существуют почти для всех серверных языков, но сегодня я хотел бы остановиться именно на PHP.

AMFPHP vs. Zend AMF


После того, как вы выбрали PHP в качестве серверной части своего приложения, следует решить какой пакет для работы с этим форматом вы будете использовать в дальнейшем. На данный момент существуют два наиболее актуальных проекта: AMFPHP и Zend AMF. Большой разницы между этими двумя продуктами нет, так что это скорее дело вкуса, но я выбрал AMFPHP для своих проектов потому что:
  • Он легче и компактнее
  • Является независимым проектом, а не частью какого-либо фреймворка
  • По результатам тестов, AMFPHP как минимум в 3 раза быстрее своего конкурента
  • Я не люблю Zend как таковой


Начало работы


Так как это мануал по AMPHP, а не AMF в целом, основное внимание я уделю непосредственно серверной части. Кроме того, флешу, по большей части, не важно, что за зверь стоит на сервере — все запросы универсальны для AMF формата, а отсюда и большое количество соответствующих материалов в сети.

Предположим, что корень нашего проекта — это корень веб-сервера. В своём мануале я буду обозначать его как /. Первое, что вы должны сделать — скачать стабильную версию AMFPHP (на момент написания данной статьи таковой является версия 1.9) и распаковать архив в /amfphp Найти её можно по этой ссылке.

Теперь необходимо произвести небольшую настройку. Для этого:

  • В файле /amfphp/globals.php в переменных $servicesPath и $voPath указываем полный путь к папкам /amfphp/services и amfphp/services/Vo соответственно
  • В файле /amfphp/gateway.php ищем обращение к методу $gateway->setCharsetHandler(); и задаём «none» в качестве первого аргумента (остальные два в таком случае не имеют значения)


Default Gateway


Теперь необходимо создать гетвей, на который и будут посылаться все AMF-запросы с клиентской стороны. Конечно, можно обойтись и стандартным /amfphp/gateway.php, но настройку приложения (будь то инициализация классов, подключение к бд и прочее) следует выполнить ещё до его вызова

Создаём файл /gateway.php С примерно таким содержанием:

<?php
 
// ROOT directory
define('ROOT', '/var/www/html/');
 
// timezone
date_default_timezone_set('Europe/Moscow');
 
// load classes
require ROOT . 'loader.php';
 
// load amfphp
require_once ROOT . 'amfphp/gateway.php';


Теперь все загрузочные действия можно осуществить в /loader.php.

Сервисы и VO классы


Все сервисы хранятся в папке /amfphp/services. Если в вашем проекте подразумевается MVC архитектура (хотя в нашем случае V не очень то актуальна), то сами сервисы могут выступать в роли котроллеров. Эти сервисы-контроллеры можно наследовать от любого класса (на маппинге это не скажется), с помощью которых и можно организовать доступ к моделям и прочим методам и/или данным вашего приложения. AMF-запросы вида ServiceName.MethodName будут отправляться на метод MethodName() класса ServiceName, который должен быть описан в файле /amfphp/services/ServiceName.php

VO (Value Object) классы — это классы, доступные для маппинга между AS и серверной частями приложения. Все VO классы должны находиться в папке /amfphp/services/Vo. Стоит заменить, что файл с описанием класса, пришедшего с AMF-запросом, подгрузится автоматически, тогда как для создания объекта на серверной стороне, файл придётся инклюдить в ручную. Но все эти вопросы отпадают при использовании замечательной функции __autoload():

<?php
 
function __autoload($class)
{
        if (file_exists(ROOT . 'amfphp/services/Vo/'.$class.'.php'))
        {
                // VO
                require ROOT . 'amfphp/services/Vo/'.$class.'.php';
                return true;
        }
        else
        {
            // error
            throw new Exception('Class \'' . $class . '\' could not be located!');
            return false;
        }
}


Допустим, нам нужно отправить клиенту класс UserDataVO. Для этого создаём файл /amfphp/services/Vo/UserDataVO.php с таким содержанием:

<?php
 
class UserDataVO
{
    // Explict type
    var $_explicitType = 'UserDataVO';
 
    // some user data here...
}


И ещё одно важное замечание. Если имя VO класса на клиентской стороне содержит точки, то amfphp преобразовывает из в слэши. Это значит, что AS класс app.Vo.UserDataVO следует описывать в файле /amfphp/services/Vo/app/Vo/UserDataVo.php следующим образом:

<?php
 
class UserDataVO
{
    // Explict type
    var $_explicitType = 'app.Vo.UserDataVO';
 
    // some user data here...
}

Обратите внимание, что explict type содержит в себе полное имя класса, в то время как название самого php класса — лишь последнюю его часть.

На этом всё. Думаю эта статья пригодиться разработчикам, которые впервые сталкиваются с AMF в целом и AMFPHP в частности. Спасибо за внимание.
Tags:
Hubs:
+6
Comments10

Articles