LET'S BUILD TOGETHER

http://rockalabs.com

AlejandroPrzCu

Renier Ricardo Figueredo

FULL STACK DEVELOPER

Temas a tratar

  • Introducción a symfony
  • Proceso de creación de una app y ejemplo “Hola mundo”
  • Pequeña aplicación con base de datos para ver todas las partes de una aplicación.
  • ¿Cómo llevamos el proceso de desarrollo en rockalabs?

Introducción

  • Surgió en 2005, con Symfony1
  • En el 2011 se lanzó Symfony2
  • Sistema de versiones basado en tiempo.
  • No es precisamente un framework MVC

Un antes y después de Symfony

  • Doctrine http://www.doctrine-project.org/
  • Composer https://packagist.org/
  • Twig http://twig.sensiolabs.org/
  • Silex http://silex.sensiolabs.org/
  • Laravel https://laravel.com/
  • Drupal8 https://www.drupal.org/
  • eZ Publish http://ez.no/Community
  • Otros en http://symfony.com/projects

Aplicaciones desarrallodas

  • API REST desarrollada por http://octivi.com
    • La aplicación en su conjunto sirve 1.000 millones de peticiones cada semana
    • Las instancias de Symfony2 sirven 700 peticiones por segundo, con un tiempo de respuesta medio de tan sólo 30 milisegundos.
    • Redis almacena 160 millones de registros y MySQL más de 300 millones.

Aplicaciones desarrallodas

  • Dailymotion
    • Según Alexa (http://www.alexa.com/data/details/main/dailymotion.com), se encuentra entre los 65 sitios más visitados de Internet.
    • En diciembre de 2008 recibió la visita de 42 millones de usuarios únicos que vieron más de 922 millones de vídeos.
    • Disponen de 430 servidores, 50 de ellos dedicados al frontal web que sirve más de 5.000 páginas por segundo.
    • Solo trabajan 10 programadores

Aplicaciones desarrallodas

  • Yahoo! Answers tiene 150 millones de usuarios y 1300 millones de páginas vistas cada mes
  • Yahoo! Bookmarks, tiene 20 millones de usuarios

Instalación y creación de una app

//Instalar el instalador de symfony en nuestra PC

> sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony

 

//Crear un nuevo proyecto
> symfony new my_project lts

 

//Ejecutar la aplicación
> cd my_projet
> php app/console server:run

 

Ir a http://localhost:8000/

“Hola Mundo”

//src/AppBundle/Controller/DefaultController.php

class DefaultController extends Controller
{
    /**
     * @Route("/hello/{name}", name="hello_world")
     */
     public function helloAction($name)
     {
        return new Response(‘Hello ’.$name);
     }
}
http://localhost:8000/hello/renier

Pequeña aplicación con BD

  • Una base de datos con una tabla “Person” con los siguientes campos: id, firstname(string), lastname(string), active(boolean)
  • Un método en el repositorio para recupear las personas dado “firstname” y que esté activo
  • Una plantilla base html con el layout de la aplicación
  • Una vista para la acción
  • La acción que ejecuta la lógica de la aplicación

Crear la entidad

//Ejecutar
> php app/console doctrine:generate:entity


//Genera
src/AppBundle/Entity/Person.php
src/AppBundle/Repository/PersonRepository

 

//Crear la bd

> php app/console doctrine:database:create

 

//Actualizar la bd
> php app/console doctrine:database:update --force

Entity

//src/AppBundle/Entity/Person.php
/**@ORM\Table(name="person")*/
class Person
{
   /**@ORM\Column(name="firstName", type="string", length=255, unique=true)*/
   protected $firstName;
   //...
   public function __toString()
   {
      return $this->getFirstName().’ ‘.$this->getLastName();
   }
   //...
}

Obtener dado “firstname”

//src/AppBundle/Repository/PersonRepository
class PersonRepository extends EntityRepository
{
    public getByFirstName($firstName)
    {
        return $this->createQueryBuilder('person')
          ->andWhere('person.firstName = :firstName')
          ->andWhere(‘person.active = 1’)
          ->setParameter('firstName', $firstName)
          ->getQuery()
          ->getOneOrNullResult()
        ;
    }
}

Plantilla base de la App

//app/Resources/views/base.html.twig
<html>
<body>
   <h1>App hello world</h1>
   {% block content %}
   {% endblock %}
</body>
</html>

Vista de la acción

//app/Resources/views/default/hello.html.twig
{% extends 'base.html.twig' %}


{% block content %}
  Hello {{ person }}
{% endblock %}

Acción

    /**@Route("/hello/{name}", name="hello_world") */
     public function helloAction($name)
     {
        $person = $this->getDoctrine()->getRepository('AppBundle:Person')
          ->getByFirstName($name)
        ;
        if (!$person)
           throw $this->createNotFoundException();
       
        return $this→render(‘/default/hello.html.twig’,   [‘person’ => $person]);
     }


http://localhost:8000/hello/renier

¿Cómo se trabaja en Rockalabs?

  • Bundles
    • KnpPaginatorBundle
    • LexikFormFilterBundle
    • KnpMenuBundle
    • FOSUserBundle
    • CULabsAdminBundle
    • DoctrineFixturesBundle
    • DoctrineMigrationsBundle
  • Configuraciones básicas
  • Diseño del backend
  • Correr fixtures

Fork Symfony2

  • https://github.com/aprezcuba24/symfony-standard
  • Intalación
    • Descargar desde (https://github.com/aprezcuba24/symfony-standard/archive/My-2.8.zip)
    • Ejecutar
      • composer install
    • Ejecutar la aplicación
      • php a    pp/console server:run

CULabsAdminBundle

  • Generardor de Administración
  • Integra LexikFormFilterBundle, KnpMenuBundle, KnpPaginatorBundle
  • Permite crear themes para el admin.
  • Tiene poca configuración y se encarga de genear código real dentro de nuestra aplicación.

Generar el CRUD de Person

  • Ejecutar el comando
    • > culabs:generate:crud --entity=AppBundle:Person --route-prefix=/admin/person --with-write -n
  • Configurar la seguridad en “app/config/security.yml”
  • Configurar el menu en “app/config/backend_menu.yml”
  • Acceder a http://localhost:8000/admin/person

  • Comenzar a implementar las funcionalidades necesarias para el CRUD

  • El comando genera: La clase controladora, PersonModel, Las vitas del CUS, El Formulario, El Filtro y las pruebas automáticas

Otros bundles desarrollados

  • CULabsIlluminateBundle https://github.com/aprezcuba24/CULabsIlluminateBundle
    • Queue
    • Schedule
  • CULabsTestingBundle https://github.com/aprezcuba24/CULabsTestingBundle

CULabsTestingBundle VS PHPUnit

$client = static::createClient();


$crawler = $client->request('GET', '/hello/renier');


$this->assertGreaterThan(0,
  $crawler->filter('html:contains("Hello renier")')->count()
);

CULabsTestingBundle VS PHPUnit

$this
  ->go(‘/hello/renier’)
  ->see(‘Hello renier’)
;

Bibliografía

  • http://gitnacho.github.io/symfony-docs-es/contributing/community/releases.html
  • http://fabien.potencier.org/what-is-symfony2.html
  • http://fabien.potencier.org/templating-engines-in-php.html
  • https://github.com/symfony/symfony-installer
  • http://symfony.es/noticias/2014/08/04/sirviendo-1000-millones-de-peticiones-a-la-semana-con-symfony/
  • http://symfony.com/blog/yahoo-answers-powered-by-symfony
  • http://symfony.com/blog/yahoo-bookmarks-uses-symfony
  • http://symfony.es/noticias/2009/02/19/dailymotion-tambien-utiliza-symfony

LET'S BUILD TOGETHER

http://rockalabs.com

AlejandroPrzCu

Renier Ricardo Figueredo

TECH LEAD

Symfony2

By product@dailybot.com

Symfony2

Introducción a Symfony2

  • 1,530