Статьи

Новые возможности PHP в Flash Builder 4 — Часть 2. Использование Zend AMF и Flash Remoting

В первой из этой серии из трех частей был представлен обзор новых возможностей PHP-разработки, ориентированных на данные, в Flash Builder 4. В этой части рассматривается использование Zend AMF и Flash Remoting.

Если вы уже некоторое время интегрировали Flash и PHP, вероятно, вы использовали Flash Remoting или просто «remoting» в некоторый момент на этом пути. Remoting использует HTTP, как и предыдущий пример XML, но сериализует структуры необработанных данных в двоичный формат, называемый AMF. Результатом является намного меньший пакет данных, проходящий по сети AMF также изначально распознается проигрывателем Flash Player, поэтому получение данных по проводам и в память также чрезвычайно эффективно.

В конечном итоге это приводит к гораздо более масштабируемому решению, особенно при увеличении нагрузки на данные. Это также означает меньше времени на разработку кода, необходимого для представления существующего уровня доступа к данным в виде символьных данных XML. Однако для достижения этой эффективности вы должны использовать объекты PHP на сервере. Вам также необходимо иметь библиотеку на сервере, которая может преобразовывать входящий AMF в типы данных PHP, а исходящие типы данных PHP в AMF.

В 2009 году Adobe тесно сотрудничала с Zend для предоставления современной масштабируемой реализации в виде Zend AMF для разработчиков PHP. 

По моему опыту, здесь есть некоторая путаница относительно того, сколько Zend Framework вам нужно использовать. Zend Framework обладает множеством различных функций, не последней из которых является надежная архитектура MVC. Однако, если вы уже используете другую платформу, вы можете не захотеть прыгать с корабля и отказаться от существующей кодовой базы. Хорошей новостью является то, что все, что необходимо для использования удаленного взаимодействия, — это наличие Zend Framework для вашего сервера. Вам не нужно использовать компонент Zend MVC, чтобы получить выгоду от Zend AMF — просто используйте объекты PHP.

Вернувшись в Flash Builder, в верхней части панели «Данные / службы» справа находится набор значков. Третий значок имеет всплывающую подсказку «Подключиться к данным / сервису», которая отображает тот же диалог, который мы видели ранее. На этот раз, однако, выберите опцию «PHP», а затем нажмите кнопку «Далее». Здесь вам будет предложено ввести имя службы, как и раньше. Если вы уже используете объекты PHP, вы можете перейти к этому объекту напрямую.

 

Также обратите внимание, что есть возможность сгенерировать пример PHP-класса. Даже если вы уже используете объекты PHP, даже если вы уже используете удаленное взаимодействие, и даже если вы уже используете Zend AMF, я предлагаю вам в какой-то момент уделить время для запуска мастера с возможностью создания примера класса Хотя бы один раз. Код заглушки, который вы получите взамен, практически завершен, хорошо прокомментирован и очень полезен. Код также включает некоторые специфические сигнатуры методов, к которым вы, возможно, не привыкли видеть, что мы найдем очень полезными в данный момент. А пока вот код PHP для объекта, который я буду использовать для этого примера.

<?php


include "Person.php";


class CensusService
{
public $host = "localhost:8889";
public $user = "root";
public $password = "root";
public $db = "demo";

private function connect()
{
mysql_connect( $this -> host, $this -> user, $this -> password );
mysql_select_db( $this -> db );
}

public function getAllItems()
{
$this -> connect();

$sql = "SELECT * FROM census";
$result = mysql_query( $sql ) or die( "Query failed: " .
mysql_error() );

$census = array();

while( $row = mysql_fetch_assoc( $result ) )
{
$person = new Person();

$person -> id = $row["id"];
$person -> age = $row["age"];
$person -> classofworker = $row["classofworker"];
$person -> education = $row["education"];
$person -> maritalstatus = $row["maritalstatus"];
$person -> race = $row["race"];
$person -> sex = $row["sex"];

array_push( $census, $person );
}

return $census;
}

public function getItem( $itemId )
{
$this -> connect();

$itemId = mysql_real_escape_string( $itemId );
$sql = "SELECT * FROM census WHERE id = $itemId";
$result = mysql_query( $sql ) or die( "Query failed: " .
mysql_error() );
$row = mysql_fetch_assoc( $result );

$person = new Person();

$person -> id = $row["id"];
$person -> age = $row["age"];
$person -> classofworker = $row["classofworker"];
$person -> education = $row["education"];
$person -> maritalstatus = $row["maritalstatus"];
$person -> race = $row["race"];
$person -> sex = $row["sex"];

return $person;
}

public function createItem( Person $item )
{
$this -> connect();

$sql = "INSERT INTO census VALUES ( " .
"'" . $item -> age . "', " .
"'" . $item -> classofworker . "', " .
"'" . $item -> education . "', " .
"'" . $item -> maritalstatus . "', " .
"'" . $item -> race . "', " .
"'" . $item -> sex . "', " .
"NULL )";
mysql_query( $sql ) or die( "Query failed: " .
mysql_error() );

return mysql_insert_id();
}

public function updateItem( Person $item )
{
$this -> connect();

$sql = "UPDATE census SET " .
"age = '" . $item -> age . "', " .
"classofworker = '" . $item -> classofworker . "', " .
"education = '" . $item -> education . "', " .
"maritalstatus = '" . $item -> maritalstatus . "', " .
"race = '" . $item -> race . "', " .
"sex = '" . $item -> sex . "' " .
"WHERE id = " . $item -> id;
mysql_query( $sql ) or die( "Query failed: " .
mysql_error() );
}

public function deleteItem( Person $item )
{
$this -> connect();

$sql = "DELETE FROM census " .
"WHERE id = " . $item -> id;
mysql_query( $sql ) or die( "Query failed: " .
mysql_error() );
}

public function count()
{
$this -> connect();

$sql = "SELECT * FROM census";
$result = mysql_query( $sql ) or die( "Query failed: " .
mysql_error() );
$count = mysql_num_rows( $result );
mysql_free_result( $result );

return $count;
}

public function getItemsPaged( $startIndex, $numItems )
{
$this -> connect();

$startIndex = mysql_real_escape_string( $startIndex );
$numItems = mysql_real_escape_string( $numItems );
$sql = "SELECT * FROM census " .
"LIMIT $startIndex, $numItems";
$result = mysql_query( $sql ) or die( "Query failed: " .
mysql_error() );

$census = array();

while( $row = mysql_fetch_assoc( $result ) )
{
$person = new Person();

$person -> id = $row["id"];
$person -> age = $row["age"];
$person -> classofworker = $row["classofworker"];
$person -> education = $row["education"];
$person -> maritalstatus = $row["maritalstatus"];
$person -> race = $row["race"];
$person -> sex = $row["sex"];

array_push( $census, $person );
}

return $census;
}
}

?>

<?php

class Person
{
public $id = 0;
public $age = "";
public $classofworker = "";
public $education = "";
public $maritalstatus = "";
public $race = "";
public $sex = "";
}

?>

 После выбора объекта и нажатия кнопки «Далее» вы получите запрос на установку Flash Builder Zend Framework в вашей системе, если он еще не установлен. Это займет всего несколько минут и не займет намного больше, чем удаление дополнительного каталога в корневом веб-каталоге. Это не особенно агрессивно, и очень легко отменить (удалить каталог), поэтому, если вы еще не дали Zend AMF шанс, это была бы прекрасная возможность взглянуть. Когда развертывание будет завершено, вы также получите дополнительную информацию о пользовательской конфигурации, если захотите.

На этом этапе в мастере Flash Builder отображаются методы, которые он нашел, и которые мы можем использовать для подтверждения выбора правильного объекта. Когда вы нажмете кнопку «Готово», вам снова будет представлено напоминание о настройке типов данных. Рабочий процесс очень похож на то, что мы сделали со службой HTTP, поэтому я не буду повторять это здесь. С настроенным типом возврата вы можете перетащить метод с панели «Данные / службы» в элемент управления списком данных и просматривать данные из ваших объектов.

В третьей и последней части этой серии мы рассмотрим, как Flash Builder 4 расширяет границы с такими функциями, как неявное разбиение на страницы и управление данными.