Skip to end of metadata
Go to start of metadata

<ac:macro ac:name="unmigrated-inline-wiki-markup"><ac:plain-text-body><![CDATA[

<ac:macro ac:name="unmigrated-inline-wiki-markup"><ac:plain-text-body><![CDATA[

Zend Framework: Zend_Amf Component Proposal

Proposed Component Name Zend_Amf
Developer Notes http://framework.zend.com/wiki/display/ZFDEV/Zend_Amf
Proposers Wade Arnold
Zend Liaison Stanislav Malyshev
Revision 1.0 - 1 January 2008: Initial Draft. (wiki revision: 68)

Table of Contents

1. Overview

Zend_Amf_Server provides Action Message Format (AMF3) support for the Zend Framework that is compatible with the Flash Player 9 and above. The Adobe Integrated Runtime (AIR) and Flash Player uses AMF to communicate between an application and a remote server. AMF encodes remote procedure calls (RPC) into a compact binary representation that can be transferred over HTTP/HTTPS protocol. Objects and data values are serialized into this binary format, which increases performance as the AMF serialization is a highly optimized procedure in the Flash Player. Zend_Amf_Server will act as an AMF gateway to the Zend Framework by exposing through introspection custom class objects and functions that will respond as callbacks through the Zend_Amf_Server gateway.

What is AMF?

Action Message Format(AMF) is a binary file format representing a serialized ActionScript object. The AMF file type is used throughout the Flash Player for data storage and data exchange. For example in the Flash Player AMF is used in SharedObjects, RemoteObjects, LocalConnection, ByteArray, RTMP, and all RPC operations. Some of the benefits of AMF include:

  • File Size - AMF objects are very small and are compressed using zlib.
  • Fast Serialization/ Deserialization - AMF is transformed using native C code in the Flash Player making it very fast. The AMF format was designed to serialize and deserialize quickly under low memory and slower CPU conditions making it perfect for the web. AMF data is parsed directly into objects, meaning there is no lag for interpretation or parsing of AMF making the creation of objects complete in a single pass.
  • Native Types and Custom classes supported - You can serialize any object in Flash Player with the only exception being a displayObject.you can also map serialized objects back to custom class instanced provided the custom class is in the Flash Player when the AMF object is deserialized.

AMF existed in ActionScript 2 and was just called AMF as of ActionScript 3 the AMF protocol has been updated and is referred to as AMF3. For historical reasons the original AMF format is now referred to as AMF0. One of the main upgrades to AMF3 is that the object is now zlib compressed for faster transfer do to the smaller file size and the additional of data types that were released with ActionScript 3.

Model-View-Controller

The architectural role of Flex/Flash/Air in an MVC architecture is of the View. We need to assume that the server has more resources than the client. We can not explicitly trust the client. We assume that the view of the client will change in the future. With these assumptions in mind it is important that the end service that Zend_Amf provides is that of a controller. The controller may need to format data to prepare it for its presentation in the view and will also sanitize any incoming data and authorize the request. If you are use to working with php you should think of the Flash Player application like you would think of a smarty template or Zend_View.

It will be tempting to bypass the controller in RIA development or to place the functionality of a controller into action script. Remember our assumptions about the client and also remember that just because you are capable of functionality in ActionScript does not mean that you should.

2. References

3. Component Requirements, Constraints, and Acceptance Criteria

*PHP5
**Standard PHP Library (SPL)
**PHP5 Reflection extension
*Zend Framework

4. Dependencies on Other Framework Components

  • Zend_Server_Interface
  • Zend_Server_Reflection
  • Zend_Server_Reflection_Function_abstract
  • Zend_Server_Reflection_Method

5. Theory of Operation

Zend_Amf_Server is composed of several components, ranging from the server itself to request, response, encoding, decoding, and fault objects.

To implement Zend_Amf_Server, the developer must attach one or more classes or functions to the server instantiation, via the setClass() and addFunction() methods.

The Zend_Amf_Server will decode request objects that are received via php://input and deserialized the request and check for an existing instantiated session. Zend_Amf_Request will check the AMF header for the matching name space of the requested remote object to be called. The remote class will be instantiated and the result of the method call will be serialized via Zend_Amf_Vaslue and returned to the requested http connection via Zend_Amf_Response.

Type Mapping Table

The following mapping defines what the resulting data type would be when sent from ActionScript to PHP and PHP to ActionScript. If a data type that is not specified in this grid is sent to or from Zend_amf it will be handle as a generic object. You can then type cast the object if necessary.

PHP to ActionScript mapping
PHP ActionScript
null null
boolean boolean
string string
DomDocument xml
DateTime date
float number
integer number
Associative Array w/ mix of keys Object
Associative Array w/ Numeric index of keys Array
object object
RemoteClass Zend_Amf_Value_TypedObject typed object
Zend_Amf_Value_ByteArray flash.utils.ByteArray
Zend_Amf_Value_ArrayCollection mx.collections.ArrayCollection

Example of serialization/deserialization

The following is used to showcase passing an array to and from the Zend Framework. It is not a tutorial for how data from ActionScript we have a RemoteObject called myservice that's endpoint is Zend_Amf (use case below). We are calling a remote method called sortArray which takes an array as an argument.

In PHP we create a simple class that just re-orders the array and return an array. This is showing how the data types are handled. Zend_AMF hides all serialization from the end user on both sides. This allows the client and server application developers to leverage all of there existing capabilities and does not inject a new set of rules to make the php class Zend_AMF specific.

The result is returned to ActionScript through its callback handler. There is no type handling the method just receives an array.

Handling Exceptions via Faults

Zend_Amf_Server catches Exceptions generated by a dispatched method, and generates an Zend_Amf_Server_Fault response when such an exception is caught. The exception messages and codes are not used in a fault response which is return to the client as a Fault event. These events will be logged only as information about the error could potentially compromise the application.

6. Milestones / Tasks

7. Class Index

  • Zend_Amf_Fault
  • Zend_Amf_Request
  • Zend_Amf_Request_Http
  • Zend_Amf_Response
  • Zend_Amf_Server
  • Zend_Amf_Server_Exception
  • Zend_Amf_Server_Fault
  • Zend_Amf_Util
  • Zend_Amf_Util_BinaryStream
  • Zend_Amf_Value
  • Zend_Amf_Value_ArrayCollection
  • Zend_Amf_Value_ByteArray
  • Zend_Amf_Value_TypedObject
  • Zend_Amf_Value_ITypedObject
  • Zend_Amf_Value_Message
  • Zend_Amf_Value_Message_AcknowledgeMessage
  • Zend_Amf_Value_Message_CommandMessage
  • Zend_Amf_Value_Message_ErrorMessage
  • Zend_Amf_Value_Message_RemotingMessage
  • Zend_Amf_Parse
  • Zend_Amf_Parse_Number
  • Zend_Amf_Parse_Boolean
  • Zend_Amf_Parse_String
  • Zend_Amf_Parse_Object
  • Zend_Amf_Parse_Null
  • Zend_Amf_Parse_Undefined
  • Zend_Amf_Parse_Refrence
  • Zend_Amf_Parse_MixedArray
  • Zend_Amf_Parse_Array
  • Zend_Amf_Parse_Date
  • Zend_Amf_Parse_Xml
  • Zend_Amf_Parse_TypedObject
  • Zend_Amf_Parse_Amf3_Integer
  • Zend_Amf_Parse_Amf3_Date
  • Zend_Amf_Parse_Amf3_String
  • Zend_Amf_Parse_Amf3_Xml
  • Zend_Amf_Parse_Amf3_ByteArray
  • Zend_Amf_Parse_Amf3_Array
  • Zend_Amf_Parse_Amf3_Object

8. Use Cases

Getting started with Zend_Amf requires a basic installation of the Zend Framework on your server. Review the getting started guide for setting up your webserver. http://framework.zend.com/manual/en/introduction.installation.html

For a reference we are going to assume that your web server folder is setup in the following manor.

/data/
/public or /htdocs or /www /include/
/library/Zend/Amf/
/include/
Where the Zend Framework is placed into the /library directory

You will then need to create an index.php where all of your AMF calls will be handled. For this example all calls to the Zend Framework are from an application running in the flash player. If you are using Flash and html views together you will need to create a gateway file independent of the index.php page that has the same content.

The following is an example of your index.php file that will act as the endpoint for AMF calls. The following code instantiates the Zend_Amf server class. You then tell the class what remote services or names spaces that you want to allow your Flasher Player application to access. In the following example we have specified the HelloWorld class to be added into the Zend_Amf server to be remotely exposed. With your webserver properly configured the following file should be accessible at http://localhost/index.php

There is nothing special to Zend_Amf for creating service classes. It is just a standard PHP class file. The following class HelloWorld has one public function say which takes in a string and returns a string that has been concatenated with today's date. Note that private methods will not be exposed through Zend_Amf. Place the file into /include/services/HelloWorld.php

We will use Flex to connect to the application. The following code creates a RemoteObject endpoint that terminates at http://localhost/ which is where our following example is located. The code creates a simple input field and a button that send that data to the server on the click event.

Start with a new flex project from inside of flex builder and call it zend. You should now have an open project called product in your Navigator window. Right click on the zend project name and select 'properties'. In the Project properties dialog go into 'Flex Build Path' menu, 'Library path' tab and be sure the 'rpc.swc' file is added to your projects path. Press Ok to close the window.

We now need to tell Flex which services configuration file to use for inspecting our remote methods. For this reason create a new 'services-config.xml' file into your Flex project root folder. To do this right click on the zend project folder and select 'new' 'File' which will popup a new window. Select the product folder and then name the file 'services-config.xml' and press finish.

Flex has created the new services-config.xml and has it open. Use the following example text for your services-config.xml file. Make sure that you update your endpoint to match that of your testing server. Make sure you save the file.

Now open your project properties panel again by right clicking on the project folder from your Navigator and selecting properties. From the properties popup select 'Flex Compiler' and add the string: -services "services-config.xml". Press Apply then OK to return to update the option. What you have just done is told the Flex compiler to look to the services-config.xml file for runtime variables that will be used by the RemotingService class.

The following code is just in MXML and you can add it to your default application. Run the code and you will remoting with the Zend Framework via Zend_Amf.

It should be noted that additional examples should be constructed that will properly utilize an MVC architecture and folder names. A good database example would be a great next step.

9. Class Skeletons

]]></ac:plain-text-body></ac:macro>

]]></ac:plain-text-body></ac:macro>

Labels:
amf amf Delete
flex flex Delete
zend_amf zend_amf Delete
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.
  1. Jun 02, 2008

    <p>Obviously more details would be helpful, but I'll forward this to Matthew so he can look at the general approach and make sure it's consistent with the rest of the framework.</p>

    <p>2 items about naming:</p>
    <ol>
    <li>I don't think we should include the version number in the name. If we want to call out the versions supported, we can do that in docs.</li>
    <li>The convention is that <strong>all</strong> words- including acronyms- are Capital Cased. It might seem weird; I think this convention was borrowed from the PEAR project.</li>
    </ol>

    <p>This would result in the component name 'Zend_Amf'.</p>

    <p>Thanks.<br />
    ,Wil</p>

    1. Jul 10, 2008

      <p>I had already made the changes just found the comments section on the bottom of this page!</p>

  2. Jun 02, 2008

    <p>A couple things to note – you may be moving in these directions already, but better to make sure early. <ac:emoticon ac:name="smile" /></p>

    <p>First, use request/response objects in the design. This will facilitate unit testing, as well as provide an easy point of customization for end-user developers. Additionally, this leaves the server handling only the details of dispatching the request; the request can handle deserializing the request payload, and the response can serialize the response payload.</p>

    <p>This leads to my second point: naming. Do not include the protocol version in the component name. Instead, this can be handled in the request and response objects: Zend_Amf_Request_Version3, etc. Alternately, the request/response objects can auto-detect the version based on the request provided; this latter method is used by Zend_Json_Server in detecting JSON-RPC request versions (see the implementation in the current incubator for an example).</p>

    1. Jul 10, 2008

      <p>Thanks, I am adding just one case to see if it is AMF3 and then using the appropriate handler. I mocked my response /request objects off of Zend_XmlRpc so it should be similar in architecture. I did have specific that has been updated to better conform to the framework standards. </p>

  3. Jun 04, 2008

    <p>I agree on the protocol version in the name comments. Note that in order to correctly support an AMF request from the Flash Player that you must implement both AMF 0 and AMF 3 as all requests start out in AMF 0 and only switch to AMF 3 on the first complex object encountered for a header value or message body.</p>

    <p>I'm not familiar with the magic referred to in the spec, but it would be nice to see some guesses at what the complete API will look like to users for this module.</p>

    <p>The type mapping table would be clearer if shown in a formatted table with columns. I didn't see integer and double types mentioned in the list but I'd say they're mandatory.</p>

    <p>Do you have any thoughts on what you'll do with IExternalizable types in PHP?</p>

    <p>I think more detail is needed on how users will opt-in to which classes (and potentially methods) will be accessible via this component. There are hints as to usages of setClass() and addFunction()... does this mean one Zend_AMF_Server instance per class to be exposed as a service?</p>

    <p>Will users be able to write custom serializers/deserializers for future versions of AMF? Perhaps even supporting AMFX (an XML representation of AMF used by Flex/BlazeDS's HTTPChannel)?</p>

    <p>Speaking of BlazeDS considerations, will Zend understand and return BlazeDS "Messages" to the client or will it be simpler Flash Remoting style client libraries that will communicate with this kind of server?</p>

    <p>This may be covered by another Zend module, but more information on how a Flash client authenticates would be useful. Can you apply roles based security to restrict who can call a particular remote object?</p>

    <p>What about logging/debugging? Will you be able to enable debug logging to try and figure out what raw AMF data is being received/sent?</p>

  4. Jul 14, 2008

    <p>Peter, </p>

    <p>To conform more with the way other Zend frameworks have been implemented I am using the Value and Value types for all marker types. </p>

    <p>I do not have any idea how to deal with IExternalizable. I have seen how people have done it in Java and Python and could probably work from there. </p>

    <p>I have added example instantiation code. I am having issues with just adding name spaces but have a question out the mailing list. </p>

    <p>The goal is there is enough architecture in the Zend_Amf/Value.php class that people can add there own marker type handlers in as long as we know the byte definition for the marker type. </p>

    <p>I have little to know documentation for how to implement messaging. I am not even sure where in the AMF stack it says that it is a "message"</p>

    <p>Authentication from the AMF header needs to then run against Zend_Acl for authorization. I going to have to familiarise myself with Zend_Acl but it is where I was going to go as soon as I had all the serializers completed. </p>

    <p>I am using Zend_Log right now for debugging. It is a pretty slick API. However I had no intentions of adding the functionality for raw AMF package, header, Body inspection. Is this something that you think would be useful. It is basically required for doing development on this addition to the framework but I am not sure Flex developers would find it useful. Most people use charles or service capture for debugging but I would like to know your thoughts? </p>

    1. Jul 14, 2008

      <p>Support for IExternalizable via AMF 3 is an absolute requirement. If there isn't an equivalent in PHP, can you establish a convention that people's classes implement a readExternal and writeExternal function and you pass access to the binary stream so that they can read off the required bytes for their type?</p>

      <p>As for BlazeDS "messages" - these are simply strongly typed ActionScript classes that are used to formalize client and server communication for RPC or Publish/Subscribe requests sent through the BlazeDS "message broker". For basic RPC calls for RemoteObject, this would involve at least understanding the types LoginMessage, RemotingMessage, AcknowledgeMessage, and ErrorMessage. See the classes in this package for rpc.swc in Flex 3:</p>

      <p><a class="external-link" href="http://opensource.adobe.com/svn/opensource/flex/sdk/branches/3.0.x/frameworks/projects/rpc/src/mx/messaging/messages/">http://opensource.adobe.com/svn/opensource/flex/sdk/branches/3.0.x/frameworks/projects/rpc/src/mx/messaging/messages/</a></p>

      <p>The equivalent Java classes that these map to are in BlazeDS:</p>

      <p><a class="external-link" href="http://opensource.adobe.com/svn/opensource/blazeds/branches/3.0.x/modules/core/src/java/flex/messaging/messages/">http://opensource.adobe.com/svn/opensource/blazeds/branches/3.0.x/modules/core/src/java/flex/messaging/messages/</a></p>

      <p>As for debugging... Charles only helps debug what was sent from either the client or the server, it doesn't help you debug what the server actually thinks it received (i.e. it doesn't help debug an error in the Zend deserializers).</p>

      1. Jul 15, 2008

        <p>PHP has __sleep and __wakeup, so maybe those could be used. </p>

    2. Aug 25, 2008

      <blockquote>
      <p>I do not have any idea how to deal with IExternalizable.</p></blockquote>

      <p>Would the <a href="http://www.php.net/~helly/php/ext/spl/">SPL</a>'s <a href="http://www.php.net/~helly/php/ext/spl/interfaceSerializable.html">Serializable</a> interface be able to help with this at all?</p>

  5. Jul 14, 2008

    <p>Peter thanks for the links. I will look into them right away. Also let me do some investigation on IExternalizable. </p>

  6. Jul 14, 2008

    <p>Peter, </p>

    <p>Please don't beat me up. After reading through the live docs I can't think of when I would use IExternalizable that I would not just use the meta data tag <ac:link><ri:page ri:content-title="Transient" /></ac:link>. Any chance you have a URL to a use case so that I can better understand it. I always love learning new things about Flex! </p>

    <p>I will look through some of the blazeDS code to see where they are doing logging and construct something similar.</p>

    1. Jul 14, 2008

      <p>No prob - IExternalizable is usually a fall back when custom serialization is not possible any other way... if you were only interested in removing particular ActionScript properties from a VO then sure, perhaps <ac:link><ri:page ri:content-title="Transient" /></ac:link> could be used. But there are other custom serialization scenarios - such as including read only or static properties (not a great pattern, but people have requested it as a feature and we've suggested IExternalizable as a compromise), or a more useful scenario of reducing the size of your VO by only sending the values and not the property names as you can control the property value order. Yet another scenario is to protect yourself from changes to the API by providing a flexible but predictable serialization mechanism.</p>

      <p>The logging thing isn't as a high priority, but trust me, it will save you a <em>lot</em> of time in the future if you implement it now for when people log bugs against the implementation.</p>

  7. Jul 15, 2008

    <p>What we'd like to see here added:<br />
    1. More use-cases, explaining how you talk to AMF - including passing data both ways and calling methods.<br />
    2. Detailed explanation on data type handling - how types are mapped into PHP and from PHP to AMF, especially dealing with higher-order types like Date that may or may not have PHP classes representing them. E.g., do we store Date as AMF_Date, DateTime or timestamp, how we create date value to send to AMF, etc. <br />
    3. What are AMF3 types - how they are different, is there any reason for the PHP user to distinguish them and if yes, when? Is there any automatic way to handle them so PHP programmer wouldn't be concerned about them too much if he doesn't need to?</p>

    1. Aug 25, 2008

      <p>1. I believe that the use cases are complete. I would like to have one more that explains how to do MVC with Flex as the view. That is what I will presenting at zend con so I know it is going to be written. I am not sure if that is what needs to be in the proposal. <br />
      2. I believe that Date is a fringe case for type mapping. I will start another comment about that. Please let me know if you would like more explanation about how data types are going to be mapped onto one another. <br />
      3. The user should never need to know about AMF3/AMF0 data types except for ByteArray. This is just because it is an ActionScript specific class. It is possible to convert it in PHP but most people are just sending it to php to be written to a file or stored in a database. </p>

      <p>Date: <br />
      Actionscrupt only uses GMT/UTC for its date. PHP can convert its timestamp to a UTC date with existing functions. We can then return it to the proper format going back to actionscript with gmdate(). However there does not seem to be a simple way to send GMT to a timestamp without doing offset calculations. Something that I am not sure should be a the default in a serialization of all data. Maybe there is a function that I am un-aware of that can take GMT to Timestamp? </p>

  8. Aug 02, 2008

    <p>Hi wade,</p>

    <p>The code block in the use cases section looks good. It looks a lot like other service classes, so that should keep the learning curve down : )</p>

    <p>A few questions, suggestions:</p>

    <ul class="alternate">
    <li>What are the specific requirements for this component? What must it be able to do and what not?</li>
    <li>Could you give an use-case where this component is integrated in the MVC structure?</li>
    <li>What about AMF0 support?</li>
    </ul>

    <p>As for the mapping of AS -> PHP; The uint would probably become a regular PHP integer.<br />
    An Object could probably become a stdClass or ArrayObject instead of an associative array.</p>

    <ul class="alternate">
    <li>Jurriën</li>
    </ul>

    1. Aug 22, 2008

      <p>Jurriën<br />
      I have updated the use case so that you can really see how this will be laid out on the server. <br />
      I still need to make an MVC example to show how the controller will interact with the model. I assume that a DB example with the queries in the model and sanitizing in the controller would be a useful example. <br />
      AMF0 is a super set of AMF3. So the framework addition will work for AMF0. The difference is really in serialization. If you never run into an AMF3 object it just runs as AMF0.</p>

      <p>Thanks for your feedback!! </p>

      <p>Wade</p>

    2. Aug 25, 2008

      <p>Also these are the only requirements.
      <a class="external-link" href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Amf#Zend_Amf-3.ComponentRequirements%2CConstraints%2CandAcceptanceCriteria">http://framework.zend.com/wiki/display/ZFPROP/Zend_Amf#Zend_Amf-3.ComponentRequirements%2CConstraints%2CandAcceptanceCriteria</a></p>

    3. Aug 25, 2008

      <p>Translating from uint -> PHP integer seems fragile for uints > PHP_INT_MAX (which is typically 2^31 - 1 as they are always signed in PHP). Are you relying on PHP conversion to float? I'd tread carefully here and consider considerable QA effort to ensure the behavior round trips with AS accurately.</p>

      1. Aug 25, 2008

        <p>I was going to relay on PHP switching to float. The right answer is actually the following conversion: </p>

        <p>uint <-> float</p>

        <p>This should keep from PHP introducing rounding errors as PHP wants you to go through integer to get to float. There is some code on this page that converts a byte stream directly to float. I will give this a try and see what type of issues if any I run into. </p>

        <p><a class="external-link" href="http://us.php.net/manual/en/language.types.float.php">http://us.php.net/manual/en/language.types.float.php</a></p>

        1. Aug 25, 2008

          <p>Though that syntax wouldn't be correct in the above type table (as you can't send all floats back as uint, of course <ac:emoticon ac:name="smile" />. You're probably going to have to send float back as AMF3 Number regardless and thus not be able to round trip uint to PHP. I guess you could start testing the modulus and range of a float to see if it could fit into a uint but it's probably not worth it and just stick with Number as the client will coerce values for you.</p>

          1. Aug 26, 2008

            <p>Peter I totally agree with you. Thanks for the insight! </p>

  9. Aug 27, 2008

    <p>Wade: just a note: For Zend_Server_Reflection to work correctly to generage parameter and return value types, classes need docblocks that minimally define those annotations. So, your HelloWorld example class would need to change to:</p>
    <ac:macro ac:name="code"><ac:plain-text-body><![CDATA[
    class HelloWorld
    {
    /**

    • Say hello!
      *
    • @param string $sMessage
    • @return string
      public function say($sMessage)
      Unknown macro: { $date = getdate(); return 'You said}

      }
      ]]></ac:plain-text-body></ac:macro>
      <p>By default, Zend_Server_Reflection will leave a type string alone if it does not understand it. If you need to add additional types, let me know so we can work up a solution for you.</p>

  10. Sep 04, 2008

    <ac:macro ac:name="note"><ac:parameter ac:name="title">Zend Comments</ac:parameter><ac:rich-text-body>
    <p>The Zend Framework team approves this proposal for immediate development in the<br />
    standard incubator, with the following requirements/suggestions:</p>
    <ul>
    <li>The server class should implement Zend_Server_Interface or extend Zend_Server_Abstract</li>
    </ul>
    </ac:rich-text-body></ac:macro>

  11. Sep 04, 2008

    <p>As a loyal AMFPHP user <ac:emoticon ac:name="wink" /> i was exicted to read about this proposal and have a few questions and ideas:</p>

    <p>Edit: Bah i have just read that Jurriën almost asked the same questions as me. <ac:emoticon ac:name="smile" /> Anyway i'll let them be.</p>

    <p>Will the component support only AMF3 or also AMF0?<br />
    Do you have plans to integrate the service browser that is currently included in AMFPHP?<br />
    How do you plan to integrate the component into the MVC structure?</p>

    <p>It would be nice if the requirement for the so called gateway could be removed and all request would route through the index.php. The ZF Front Controller should detect AMF requests and if the component is enabled access controller methods with another suffix like IndexAmf or something similar. I am thinking about the same principle that the context switch controller helper utilizes.</p>

    1. Sep 04, 2008

      <p>As noted in other comments Wade has made, AMF0 is actually a superset of what AMF3 supports – so everything will continue to work.</p>

      <p>Regarding your Front Controller statements, we will <strong>not</strong> add such support; we do not want to add features to the front controller at this time, particularly to support specific protocols. That said, it's fairly trivial to create either routes that detect AMF requests and route to an appropriate controller, or simply specify an MVC endpoint as an AMF server – many people have done similarly with XML-RPC, REST, and Soap with ZF already.</p>

    2. Nov 13, 2009

      <p>I just posted a ZendAMF Service Browser at <a class="external-link" href="http://www.zamfbrowser.org">http://www.zamfbrowser.org</a>. There are implementation examples there, it simply requires 3 lines of code in your gateway file. There's a step through in the Documentation section.</p>

  12. Jan 19, 2009

    <p>A correction is needed in the "What is AMF?" section: neither AMF 0 nor AMF 3 make use of zlib compression. Developers may decide to zlib compress HTTP responses if clients support it, but this is a general approach to shrinking HTTP responses and it is independent of AMF.</p>

    <p>AMF achieves its efficiency through the use of small type markers to represent common data types and by-reference serialization to avoid sending redundant data. This improved in AMF 3 as object traits and strings can be sent by reference in addition to complex object instances.</p>

  13. Mar 12, 2009

    <p>In the example in "8. Use Cases" there is missing an echo statement.</p>

    <p>It says: </p>

    <p>$server->handle();</p>

    <p>it should be:</p>

    <p>echo $server->handle();</p>

    <p><ac:emoticon ac:name="smile" /></p>

  14. Aug 20, 2009

    <p>Hi,</p>

    <p>Perhaps, I'm making a mistake by posting my request here but I don't know where I could do it.<br />
    So, I'm using your Zend_Amf module in a Zend Framework 1.8/ PHP 5.2.9 environment and I was questionning myself about the possibility to use your module with an older version of Zend Framework (like 1.6) and an older version of PHP (like 5.1.6) ?? I've made some research on the web and the answers never satisfied me ...</p>

    <p>Cordially.</p>

    <p>Antoine</p>

  15. Sep 12, 2010

    <p>Hi,</p>

    <p>just wondering if there are any plans on continuing this lib? I really miss the Zend_Amf_Constants::ET_EXTERNAL </p>

    <p>would be nice to have an interface Zend_Amf_IObject which implements the function toAmf() and getASClass()</p>

    <p>and maybe Zend_Db_Table_Row and Rowset can implement this by default</p>

    <p>cheers</p>