Desarrollo de aplicaciones web usando Catalyst y jQuery
De symfony 2013 dr. jenkins y mr. hyde - slides-842359017
1.
2.
3. Dr. Jenkins y Mr. Hyde
Acto I - Los personajes
Acto II - Envuelvelo en una API "REST"
Acto III - Dos en uno
Acto IV - Sangre, sudor y migraciones
Acto V - URL's y Redis
desymfony 2013 Dr. Jenkins & Mr. Hyde
4. ACTO I - Los personajes
desymfony 2013 Dr. Jenkins & Mr. Hyde
6. • PHP 4 Spaghetti western
• Ausencia MVC
• Inicio del desarrollo en 2000
• Reescritura del 90% en 2007
• + de 25 desarrolladores
• 4 Bases de datos
• Más de 1.5M de líneas de código
• Formado por: Directorio, CRM+ERP, Lista de bodas,
Estadisticas, Extranet para clientes, CMS, Área de
contenidos, WebTV, Etc.
Mr. Hyde
desymfony 2013 Dr. Jenkins & Mr. Hyde
9. • REST
• PHP 5.4
• Symfony 2.1.x
• LAM
• SQLite
• Redis con Twemproxy
• MongoDB
• RabbitMQ
• Jenkins, PHPUnit & Capifony
• Satis
Dr. Jenkins
desymfony 2013 Dr. Jenkins & Mr. Hyde
10. Joel Spolsky (Stack Overflow co-founder) dijo:
(sobre Netscape)" Bueno, si. Lo hicieron. Lo hicieron al tomar la peor
decisión estratégica que una empresa de software puede hacer:
decidieron re-escribir el código desde 0"
fuente: http://www.joelonsoftware.com/articles/fog0000000069.html
Dan Milsten, fundador de Hub8, en un post en On Startups (publicado
por Dharmesh Shah, inversor de Stack Exchange):
"Prepárate para que este proyecto no termine jamás.Lo primero y
absolutamente crítico que tienes que entender sobre empezar una
reescritura es que va a tomar muchísimo más de lo que esperas. Incluso
después de que quitas el típico optimismo del desarrollador. He aquí
porqué: Migrar datos es lo peor que puedes echarte a la cara, más allá
de cualquier otra cosa.“
fuente: http://onstartups.com/tabid/3339/bid/97052/How-To-Survive-a-Ground-Up-Rewrite-Without-Losing-Your-Sanity.aspx
Re-escribir desde 0, según los expertos
desymfony 2013 Dr. Jenkins & Mr. Hyde
11. ACTO II - Envuelvelo en una API "REST"
desymfony 2013 Dr. Jenkins & Mr. Hyde
13. Las bases de datos
BBDD 1
BBDD 3 BBDD 4
BBDD 2
desymfony 2013 Dr. Jenkins & Mr. Hyde
BBDD 1
BBDD 3 BBDD 4
Relacionadas entre si por claves extranjeras mantenidas por software
14. //namespace BDKLegacyDbBundleEntity;
/**
* @ORMTable(name="boda.CLIENTE")
* @ORMEntity
*/
class Cliente
{
//...
/**
* @ORMManyToMany(targetEntity="Tags")
* @ORMJoinTable(name="bodamoll.b_tags",
* joinColumns={@ORMJoinColumn(name="id_cliente", referencedColumnName="ID")},
* inverseJoinColumns={@ORMJoinColumn(name="id_tag", referencedColumnName="id")}
* )
*/
private $id_tag;
//...
Hackeando las DQL
desymfony 2013 Dr. Jenkins & Mr. Hyde
15. public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
if ($this->kernel->getEnvironment() != 'test') {
return;
}
$classMetadata = $eventArgs->getClassMetadata();
$assoMap = $classMetadata->getAssociationMappings();
foreach ($assoMap as $asso) {
if (isset($asso["joinTable"])) {
$asso["joinTable"]["name"] = str_replace(".", "_", $asso["joinTable"]["name"]);
$classMetadata->setAssociationOverride($asso["fieldName"],$asso);
}
}
$tableName = $classMetadata->getTableName();
$classMetadata->setPrimaryTable(array('name' => str_replace(".", "_", $tableName)));
}
Hackeando las DQL
desymfony 2013 Dr. Jenkins & Mr. Hyde
27. Perfil del
usuario
Enlaces a la plataforma antigua
Login
Frontal
login
único
App.
nueva
App.
antigua
Perfil del
usuario
Info del
usuario
OAuth + Token WSSE (login)
Acceso al perfil del usuario
desymfony 2013 Dr. Jenkins & Mr. Hyde
28. Internet Reverse
Proxy
Perfil del usuario - Reverse Proxy
bodaclick.com/^((?!my).)*$
bodaclick.com/my
desymfony 2013 Dr. Jenkins & Mr. Hyde
30. Perfil del usuario - Reverse Proxy
desymfony 2013 Dr. Jenkins & Mr. Hyde
Internet Reverse
Proxy
bodaclick.com/^((?!my).)*$
bodaclick.com/my
iframe
31. ACTO IV - Sangre, sudor y migraciones
desymfony 2013 Dr. Jenkins & Mr. Hyde
32. • 4 bases de datos
• Datos inconsistentes
• Emails repetidos
• Fechas como 0000-00-00
• Enums
• Tenemos tablas con más de 100 campos
• Campos por defecto a 0000-00-00
• Tablas tanto innodb como MyISAM
• Cotejamientos diferentes (utf8, latin)
• Tablas > 6 GB
API Legacy - Mapeo
desymfony 2013 Dr. Jenkins & Mr. Hyde
44. Evento asíncrono comunicado al driver
AsyncEventDispatcher
Controlador
Evento
propio
desymfony 2013 Dr. Jenkins & Mr. Hyde
45. //abstract class AsyncWeddingEvent implements AsyncEventInterface;
//class PostCreatWeddingEvent extends AsyncWeddingEvent;
$event = new PostCreateWeddingEvent();
$event->setWedding($wedding);
$event->setUserProfile($userProfile);
$this->container->get('bdk.async_event_dispatcher')->dispatch($event);
Evento asíncrono lanzado
desymfony 2013 Dr. Jenkins & Mr. Hyde
46. Evento asíncrono comunicado al driver
Listener/
Publicador
o Driver
AsyncEventDispatcher
Controlador
Evento
propio
desymfony 2013 Dr. Jenkins & Mr. Hyde
47. Evento asíncrono para un sistema pub/sub
Sistema Pub/Sub
Listener/
Publicador
o Driver
AsyncEventDispatcher
Controlador
Evento
propio
desymfony 2013 Dr. Jenkins & Mr. Hyde
49. Evento asíncrono para un sistema pub/sub
Sistema Pub/Sub
Subscriptor MySQLMySQL
Listener/
Publicador
o Driver
AsyncEventDispatcher
Controlador
Evento
propio
desymfony 2013 Dr. Jenkins & Mr. Hyde
App. nueva App. antigua
50. Evento asíncrono para un sistema pub/sub
Consumidor MySQLMySQL
Listener/
Productor
o Driver
AsyncEventDispatcher
Controlador
Evento
propio
desymfony 2013 Dr. Jenkins & Mr. Hyde
*.wedding.event
RabbitMQ
Topic Exchange
App. nueva App. antigua
51. //BDKLegacyBundleEventListenerAsyncWeddingEventListener
class WeddingEventListener implements ConsumerInterface
{
//...
if ($wedding->getProvince()) {
$legacyCountry = $this->legacyEm->getRepository('BDKLegacyDbBundle:Pais')
->findOneByCodPais($wedding->getProvince()->getCountry());
$legacyProvince = $this->legacyEm->getRepository('BDKLegacyDbBundle:Provincia')
->findOneBy(['idPais' => $legacyCountry->getId(), 'provincia' =>
$wedding->getProvince()->getName()]);
$legacyEventUser->setProvinciaId($legacyProvince->getId());
}
//...
}
Consumidor
desymfony 2013 Dr. Jenkins & Mr. Hyde
59. @etorras79
etorras
@BodaclickIT
Enrique Torras, como Mr. Hyde
• Ingeniero en Informática
• Desarrollando web desde 2004
• Actualmente dirige el área de
desarrollo en Bodaclick
desymfony 2013 Dr. Jenkins & Mr. Hyde
slideshare.net/etorras
60. @egulias
egulias
• Desarrollador web desde 2006
• Coqueteando con Symfony (y
otros frameworks) desde 2007
• Miembro de Symfony Madrid
• Actualmente trabajando como
líder de equipo en Bodaclick
@BodaclickIT
Eduardo Gulias, como Dr. Jenkins
slideshare.net/egulias
joind.in/talk/view/8834
desymfony 2013 Dr. Jenkins & Mr. Hyde