Download - Applicazioni distribuite con Symfony2
![Page 1: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/1.jpg)
10ottobre2014,SymfonyDay,Milano
![Page 2: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/2.jpg)
[email protected](Utilities)...maanchefotografoeviaggiatore
[email protected]/thinkindieinstagram.com/thinkindie
![Page 3: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/3.jpg)
Facile.itèuncomparatoreditariffe
assicurativeenergetiche(luceegas)telefoniche(ADSL,fissoemobile)mutui,contibancarieprestiti
InostriufficisonoaMilano,masoprattutto...
![Page 4: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/4.jpg)
StackLAMP/LEMPSymfony/ZendElasticSearchNode.jsRabbitMQRedisEmber.js/AngularJS/Backbone.jsVagrant/Ansible/Puppet
SiamopresentianchesuGitHubgithub.com/facile-it
![Page 5: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/5.jpg)
![Page 6: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/6.jpg)
Bunny
![Page 7: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/7.jpg)
SeparazionetrafrontendebackendMultibusinessRicercaglobaleACL,anchenellaricercaGestionediprocessiinbackground
![Page 8: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/8.jpg)
![Page 9: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/9.jpg)
WebService RESTful basatosull'esistenza di (ades. leentità
diDoctrine)dicuisihaaccessoalleloro tramite un
globale(URI).
![Page 10: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/10.jpg)
GET/api/users/1HTTP/1.1Host:ws.bunny.facile.itAccept:application/vnd.api+json
HTTP/1.1200OKContent-Type:application/vnd.api+jsondate:Thu,19Oct201414:38:16GMT
{"id":1,"timestamp":"2014-06-10T15:42:37+02:00","lastUpdateTimestamp":"2014-06-10T15:42:37+02:00","username":"BunnyWs","nome":"Bunny","cognome":"WS","email":"[email protected]","isActive":true}
![Page 11: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/11.jpg)
FOSRestBundleFOSOAuthServerBundleFOSUserBundleJSONAPI(Ember.jsDriven)
![Page 12: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/12.jpg)
Semplifica e velocizza lo sviluppodi unWebServiceRESTful
gestionedeicodiciHTTPdirispostadifferenti view handlers perdifferentivaloridiAcceptURLREST-friendly
![Page 13: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/13.jpg)
/***@RouteResource("Compagnia")*/classCompagnieControllerextendsBunnyController{/***@View()*/publicfunctioncgetAction(){}/***@View()*/publicfunctiongetAction(Request$request){}/***@View()*/publicfunctionpostAction(Request$request){}/***@View()*/publicfunctionpatchAction(Request$request){}/***@View()*/publicfunctiondeleteAction(Request$request){}}
![Page 14: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/14.jpg)
UnbundledibaseperilWS
Unbundleperognibusiness(ADSL,Luce&Gas,Mobile),
differenti alpiùperunnumero ristrettodi entitàodi
comandiinbackground
Un bundle per ciascuna altra attività cross-
business(es.:inviodiSMS)
![Page 15: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/15.jpg)
Posso rapidamente ricercare unqualsiasi documento contenenteunqualsiasitermineFOSElasticaBundle: le entità diDoctrine vengono persisteanchesuElasticSearch
![Page 16: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/16.jpg)
SmartReindexing: la modifica diunaentità richiede l'aggiornamentodi tutti i documenti in cui ècontenuta
![Page 17: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/17.jpg)
$inheritanceTree=$this->getInheritanceTree($rootEntity);$entities=$this->em->getConfiguration()->getMetadataDriverImpl()->getAllClassNames();foreach($entitiesas$entity){$class=$this->cmf->getMetadataFor($entity);$associationMappings=$class->getAssociationMappings();if(empty($associationMappings)){continue;}else{foreach($associationMappingsas$nestedEntity){if(in_array($nestedEntity['targetEntity'],$inheritanceTree)){...}}}}
DoctrineMetadata:hogiàunamappa(ricorsiva)dellerelazionitraentità
![Page 18: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/18.jpg)
ACL= ccess ontrol istPermettono di definire regole ( )capillariperaccederearisorse.Es.: permessi dei files supiattaformeUnix,regoledelfirewall.
![Page 19: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/19.jpg)
La gestione base delle ACL vieneaffidata al provider di default diSymfony e vengono persistite suMySQL
![Page 20: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/20.jpg)
Le ACE vengono definite in ciascunaentitàtramitecustomannotationsnamespaceFacile\Ws\BunnyBundle\Entity;useFacile\Ws\BunnyBundle\Annotation\EntityAceasACE;/***@ACE("ROLE",name="ROLE_ADMIN",mask="MASK_MASTER");*@ACE("ROLE",name="ROLE_USER",mask="MASK_VIEW");*/classCompagnia{/***@ACE("ROLE",name="ROLE_USER",mask="MASK_VIEW")*@ACE("ROLE",name="ROLE_ADMIN",mask="MASK_MASTER")*/protected$nome;}
![Page 21: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/21.jpg)
Utilizzare il provider di default diSymfony per filtrare una collezione dientità non è nésoddisfacente.
![Page 22: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/22.jpg)
Youknow,forsearch!
![Page 23: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/23.jpg)
QuandounaentitàvienesalvatasuElasticSearchildocumentovienedivisoindueparti
:contenenteleACL"espanse":l'entitàveraepropria
![Page 24: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/24.jpg)
{"data":{"lastUpdateTimestamp":"2014-10-08T09:28:45+02:00","id":5,"timestamp":"2014-06-10T15:42:33+02:00","venduto":true,"nome":"Facile.it","type":"energia"},"meta":{"acl":[{"mask":1,"name":"role_user","type":"role"},{"name":"role_admin","mask":64,"type":"role"}]}}
![Page 25: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/25.jpg)
Laricercadidocumentivieneeseguitacon\Elastica\Queryefiltrataconiruoliricopertidall'utenteattivo$elasticaFilterOr=new\Elastica\Filter\BoolOr();foreach($this->getUserExpandedRoles()as$role){$elasticaFilterRolesName=new\Elastica\Filter\Term();$elasticaFilterRolesName->setTerm('meta.acl.name',strtolower($role));$elasticaFilterRolesType=new\Elastica\Filter\Term();$elasticaFilterRolesType->setTerm('meta.acl.type','role');
$elasticaFilterAndRole=new\Elastica\Filter\BoolAnd();$elasticaFilterAndRole->addFilter($elasticaFilterRolesName);$elasticaFilterAndRole->addFilter($elasticaFilterRolesType);
$elasticaFilterOr->addFilter($elasticaFilterAndRole);}
$elasticaQuery=new\Elastica\Query(new\Elastica\Query\MatchAll());$elasticaQuery->setFilter($elasticaFilterOr);
![Page 26: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/26.jpg)
Utilizzandoifiltri(dalladocumentazionediES):
nonvienecalcolatolo_scoreperognidocumento,ma
vieneapplicataunalogicabooleana
irisultatidimoltifiltripossonoesseresalvatiincache
restringo la query sui documenti effettivamente
ricercabili,ottimizzandolaquerystessa
![Page 27: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/27.jpg)
Redis è un database di tipo chiave-valore,dovelachiave,comeilvalore,possono essere una qualsiasisequenzadibytes.
http://redis.io
![Page 28: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/28.jpg)
Redisèutilizzabileper:
CachingavanzatoRankingsintemporealeContatoriPub/SubCode
![Page 29: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/29.jpg)
BunnyutilizzaRedisperlacachedi
MetadatidiDoctrineQuery(DQL SQL)RisultatidellequeryEntità
![Page 30: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/30.jpg)
doctrine:orm:entity_managers:bunny:metadata_cache_driver:type:redishost:localhostport:6380query_cache_driver:type:redishost:localhostport:6380result_cache_driver:type:redishost:localhostport:6380
![Page 31: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/31.jpg)
Redis viene utilizzato anche per lagestionedi codeconResque tramitephp-resque.Qualsiasi operazione cheparticolarmente complessa vienedemandata quindi ad un processoasincronooprogrammato.
![Page 32: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/32.jpg)
Esempidiprocessiasincroni:
SmartReindexingGenerazionediReportCaricamento su account FTPesterniCaricamentibatchsugestionaliditerzi
![Page 33: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/33.jpg)
![Page 34: Applicazioni distribuite con Symfony2](https://reader033.vdocuments.mx/reader033/viewer/2022052412/5594a76a1a28ab5e348b4694/html5/thumbnails/34.jpg)
https://joind.in/talk/view/12215