qui di seguito una piccola guida, spero utile a chi vuole configurare un servizio amf in symfony2. Per chi non ha idea di cosa si tratti, amf e' un protocollo binario supportato dal flashplayer che permette di mantenere i tipi di dato e scrivere web application con un marcia in piu' rispetto alle classiche chiamate http/rest, specie se i dati in transito sono parecchi.
ingredienti:
- symfony2
- zend2
- Tecbot AMFBundle
- JSMSerializationBundle
- AmfBundle-Sandbox, per testare il tutto: contiene codice d'esempio e un'app flex da compilare.
Tutto questo materiale si trova su github ma non e' necessario visitare i singoli repository, bastera' indicarli nella propria configurazione di test.
Il mio punto di partenza e' stato eclipse, che ha un un plugin molto utile per la stesura di progetti symfony.
Creato un nuovo progetto symfony2 senza vendors.
Come probabilmente sapra' chi lavora con questo framework, c'e' da impostare il permessi in cache, io ho ubuntu e per farlo uso l'utility setfacl.
Controllate qui per ulteriori dettagli.
prime modifiche alla configurazione, modificare il file deps:
[metadata]
git=http://github.com/schmittjoh/metadata.git
version=1.1.0
e deps.lock:
metadata 1.1.0
la versione che avevo io era la 1.0.0 e non e' adatta, genera errori.
modificare ancora il file deps per includere i repository extra:
[Zend]
git=https://github.com/zendframework/zf2.git
target=/zend
[JMSSerializerBundle]
git=git://github.com/schmittjoh/JMSSerializerBundle.git
target=bundles/JMS/SerializerBundle
[AMFBundle]
git=https://github.com/tecbot/AMFBundle.git
target=../src/Tecbot/AMFBundle
a questo punto si e' pronti per installare le librerie, occhio che verra' giu' un paio di centinaia di mb percio' pazienza.
Positionarsi nella cartella del progetto con la shell e dare:
$ php bin/vendors install
si avra' una cartella vendor con le librerie, in src si avra' il bundle AMF
modificare app/autoload.php:
...
'Metadata'
DIR.'/../vendor/metadata/src',
...
'Zend'
DIR . '/../vendor/zend/library',
'Tecbot'
DIR.'/../src',
'Acme'
DIR.'/../src',
));
scaricare e scompattare da qualche parte il bundle amf sandbox
copiare src/Acme/AmfBundle in /src/Acme nel proprio progetto
IMPORTANTE, la cartella AMF ivi contenuta va rinominata in Amf, errori come questo sono probabilmente legati al fatto che quest'applicazione di prova e'un po' datata rispetto al bundle amf.
Dal momento che quella cartella aveva un nome tutto in maiuscolo, vanno anche corretti i namespace nei pochi file php che vi troverete, ad esempio:
// DemoService.php
namespace Acme\AmfBundle\Amf;
use Acme\AmfBundle\Amf\VO\MessageVO;
...
e via cosi' per MessageVO.php
Modificare app/AppKernel.php
...
new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
new Acme\AmfBundle\AcmeAmfBundle(),
new Tecbot\AMFBundle\TecbotAMFBundle(),
);
in questo modo al bootstrap di symfony si avranno i bundle incaricati di gestire amf
modificare app/config/config.yml
io ho scelto di inserire direttamente qui delle direttive, se preferite, potete importare il file amf.yml dalla sandbox.
...
tecbot_amf:
# Services
services:
DemoService: AcmeAmfBundle
emo
# Class mapping
mappings:
MessageVO: Acme\AmfBundle\Amf\VO\MessageVO
Si puo' capire che queste fanno riferimento alla classe da poter invocare via amf e il ValueObject che andra' a mappare. Dato che sitamo parlando di banali test, quelle classi sono ridotte all'osso.
Modificare app/config/routing.yml
_demo:
pattern: /someapp
defaults: { _controller: AcmeAmfBundle
emo:index }
techbot_amf:
resource: "@TecbotAMFBundle/Resources/config/routing.yml"
La prima route e' poco rilevante, invocandola si avra' in risposta l'indexAction giusto per testare che l'app e' configurata.
La seconda route e' molto piu' significativa: il file routing.yml di Tecbot ha una route per l'endpoint a /gateway
Naturalmente la si puo' editare a piacere.
prima di fare un qualsiasi test consiglio di svuotare la cache, sempre da una shell nella cartella di progetto:
$ php app/console cache:clear
$ php app/console --env=prod cache:clear
se si prova direttamente dal browser l'endpoint, si ricevera' in risposta: Symfony Amf Endpoint
Se non compare, rivedere la configurazione. Inizialmente puo' essere necessario del tempo, penso dovuto al caching di classi di libreria di zf2 e sf2.
Per testare l'app io ho configurato un vhost per cui il link in questione da me e':
http://sym.local/gateway
In una forma piu' grezza potrebbe essere:
http://localhost/myproject/web/app.php/gateway
Se tutto e' OK, e' ora di passare a flex.
Fare riferimento alla sandbox, cartella flash.
modificare il file src/acme/utils/Config.as
...
public static const GATEWAY : String = "http://localhost/amf.php"; // inserire il proprio endpoint
...
a questo punto si potra' compilare, io uso direttamente il compilatore, se puo' interessare, e' questa (posizionarsi in src):
$ mxmlc AcmeAmfDemo.mxml -debug=true -benchmark=true ...
... -static-link-runtime-shared-libraries=true --target-player=11 -library-path+=../libs -output ../deploy/AcmeAmfDemo.swf
copiare il file AcmeAmfDemo.swf nella cartella web del proprio progetto.
Ricordo che stiamo facendo dei banali test, e' chiaro che in prospettiva di sviluppo serio, ci si prendera' cura del templating e della corretta gestione degli oggetti flash nel codice di pagina.
A questo punto dovremmo essere pronti per testare il tutto, aprire il browser e inserire l'url del file swf appena ottenuto, il mio e' questo:
http://sym.local/AcmeAmfDemo.swf
potrebbe essere:
http://localhost/myproject/web/AcmeAmfDemo.swf
il tutto consiste in un campo testo in cui scrivere un messaggio di test, fare il submit e quindi ricevere una risposta elaborata dal bundle AcmeAmfBundle
Happy hacking with actionscript & php.

Jaco