subscribe

SabreAMF 1.0 release

SabreAMF is now considered stable.. It has been tested for over a year, and no problems have been reported for a while.

I'm not totally sure where to go from here though; The original design goals have been met, documentation is written and it is well tested. Adding features for the sake of adding features doesn't seem like a good idea; so I guess this is where the project sort of halts..

I'll stick around to support and maintain it though.

Get it here. If you are running 1.0-beta4, don't bother (it's the same)

Web mentions

Comments

  • Theo

    Theo •

    Hooray!
  • Darren

    Darren •

    Congratulations, Evert! I think it's fantastic that you have donated so much time to helping other programmers.

    Having a little bit of AMFPHP experience, I was up and running with SabreAMF (and Flex) in 5 minutes after reading Renaun's tutorial (http://www.adobe.com/devnet/flex/articles/remoteobject_sabreamf.html).

    One thing I did have to do to get it working with my particular setup was to alter my includes path so that all the SabreAMF require_once's would work. The way I have my setup is to have all my common PHP libs stored in a folder within my PHP includes folder so that I can use them from any project. With this setup, all I need is a custom gateway.php, as well as services and vo folders, for each project and I can use the one installation of SabreAMF for every project. All I had to do to get this working was to include this line at the start of each project's gateway.php:

    set_include_path( get_include_path() . PATH_SEPARATOR . get_include_path() . '/my__common_libs_folder/' );

    I only mention this in case others wish to use a setup like mine. SabreAMF works fine out of the box as long as you put the files in their recommended locations.

    Thanks again,
    Darren.
  • Thijs Triemstra

    Thijs Triemstra •

    Congratulations with the release! It came a long way.
  • Darren

    Darren •

    Another couple of observations about SabreAMF from someone moving across from AMFPHP (which may or may not be helpful to you):

    1. I found that I had to call SabreAMF_ClassMapper::registerClass before instantiating the SabreAMF_CallbackServer to get the mapping from Flex to PHP to work. I sort of anticipated that registerClass may need to be called before the onInvokeService listener was set but I was surprised that it had to be called even before the SabreAMF_CallbackServer was instantiated. So, using Renaun's code (DataServicesServer.php), this was the only order that worked for me:

    public function __construct() {
    SabreAMF_ClassMapper::registerClass('com.renaun.samples.vo.UserVO','UserVO');
    $this->server = new SabreAMF_CallbackServer();
    $this->server->onInvokeService = array($this,'invokeService');
    }

    This order of instructions wasn't clear to me from the docs and it also didn't occur to me straight away because if I set a listener for $onGetRemoteClass instead, this seems to work fine after the SabreAMF_CallbackServer is instantiated (which is where Renaun has it). Maybe it would be worthwhile mentioning in the wiki that 'SabreAMF_ClassMapper::registerClass' should be called before 'new SabreAMF_CallbackServer();' for Flex to PHP mapping to work. Or maybe this is obvious and I'm just a little slow.

    2. Similarly, adding a listener using SabreAMF_ClassMapper::$onGetLocalClass only works if it is placed before "new SabreAMF_CallbackServer();' while SabreAMF_ClassMapper::$onGetRemoteClass works both before or after. By the way, I wrote this tiny getLocalClass function which seems to work well for Flex:

    public function getLocalClass( $dataClassName ) {
    $className = array_pop(explode(".", $dataClassName));
    if(class_exists($className)) {
    return $className;
    } else {
    return SabreAMF_ClassMapper::getRemoteClass( $dataClassName );
    }
    }

    3. Is there a typo in line 118 of ClassMapper.php? Should it be:

    throw new Exception('Classname received from onGetRemoteClass should be a string or return false. ' . gettype($remoteClass) . ' was returned');

    I hope some of this is helpful.

    I'm really liking SabreAMF. I hope to use it on most of my future Flex-PHP projects. If you do get AMFEXT working with your framework project, I hope you will consider making SabreAMF AMFEXT-compatible because at the moment the faster speed seems to be the only reason I would consider using AMFPHP on some bigger projects.

    Cheers,
    Darren.
  • Darren

    Darren •

    Oops, getLocalClass should be:

    public function getLocalClass( $dataClassName ) {
    $className = array_pop(explode(".", $dataClassName));
    if(class_exists($className)) {
    return $className;
    } else {
    return false;
    }
    }
  • Evert Pot

    Evert Pot •

    Darren,

    The behaviour you are seeing with adding the classmaps before or after instantiating the callbackserver is really really odd, as the logic only starts to kick in after a call to ->exec()

    It makes me wonder there might be something else wrong in the logic of that code ??

    As to your point about the typos in the exception being thrown, I just fixed that on SVN and will put out an update soon.. Good thing the error is in the error handling so it won't actually break any running apps..

    Thanks a lot ! If you are interested in helping out with some of the wiki pages, please drop me a line.. my address is evert @ this domain..

    Evert
  • cms

    cms •

    Very fast new version. Great!
  • Wil

    Wil •

    Hi, I'm wondering if there's a minimal example for using SabreAMF on the flash/flex side. The examples I found in the adobe site is too complex/intimidating for newbies like me.
  • Wil

    Wil •

    Ahh nevermind, spent an entire day experimenting with the API and here's what I got: http://blogs.crammerz-inc.net/thunk/2007/12/31/getting_started_with_sabreamf some guidelines on the use/misuse would be helpful though...