SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Introducción a Symfony2

             Por: Mario J. Inga Cahuana
                              @mario21ic
Agenda
● ¿Qué és?
● Características

● Arquitectura MVC

● Flujo de apps

● Componentes

● Bundle

● Taller

● Links

● Preguntas
¿Qué es Symfony2?
●   Creado por la comunidad y liderada por
    Fabien Potencier
●   Desarrollado en PHP 5.3
●   Arquitectura MVC
●   Predecesor de Symfony 1
●   Agrupación en bundle
●   Configuración en: YAML, XML, PHP
Características
●   Alto rendimiento
●   Usabilidad avanzada
●   Extensible
●   Flexible
●   Contruido para desarrolladores
●   Construido en base a otros grandes
    frameworks
●   Listo para usar
●   OpenSource
Arquitectura Symfony2

●   MVC: Modelo, Vista y Controlador
●   Controlador: Symfony2
●   Modelo: Doctrine, ORM basado en
    Hibernate
●   Vista: Twig, basado en plantillas de Django
Flujo de apps Symfony2
Componentes
●
    HttpFoundation:      Contiene las clases Petición y Respuesta, así
    como otras clases para manejar sesiones y cargar archivos
●
    Enrutado:     Potente y rápido sistema de enrutamiento que te
    permite asociar una URI específica (por ejemplo /contacto) a cierta
    información acerca de cómo se debe manejar esa petición (por
    ejemplo, ejecutando el método contactoAction())
●   Form: Una completa y flexible plataforma para crear formularios y
    procesar los datos presentados en ellos
●   Validator: Un sistema para crear reglas sobre datos y entonces,
    cuando el usuario presenta los datos comprobar si son válidos o no
    siguiendo esas reglas
Componentes
●
    Classloader:      Una biblioteca de carga automática que permite
    utilizar clases PHP sin necesidad de require los archivos que
    contienen esas clases manualmente;
●
    Plantillas:  Un juego de herramientas para reproducir plantillas,
    manejar la herencia de plantillas (es decir, una plantilla es decorada
    con un diseño) y realizar otras tareas comunes de las plantillas
●   Security: Una poderosa biblioteca para manejar todo tipo de
    seguridad dentro de una aplicación
●   Translation: Una plataforma para traducir cadenas en tu
    aplicación
Bundle
●   Los bundles son la base de la nueva filosofía de trabajo
    de Symfony2. El código de tus aplicaciones y el propio
    código fuente de Symfony2 se estructura mediante
    bundles.
●   Técnicamente, un bundle es un directorio que contiene
    todo tipo de archivos dentro una estructura jerarquizada
    de directorios, que suelen contener clases PHP y
    archivos web (JavaScript, CSS e imágenes).
Taller
●   Objetivo:
    Realizar un pequeño CRUD con 2
    modelos relacionados.

●   Requisitos:
    Linux, PHP 5.4, MySQL o PostgreSQL, Git
Taller - Instalación
●   Instalando con composer:
    $ curl -s https://getcomposer.org/installer | php
    $ composer.phar create-project symfony/framework-
    standard-edition symfony2_taller 2.1.7

●   Descargando:
    $ wget http://symfony.com/download?
    v=Symfony_Standard_Vendors_2.1.7.tgz
    $ tar -xvf Symfony_Standard_2.0.16.tgz
Taller - Instalación
●   Verificar requerimientos:
    $ php app/check.php

●   Correr el server:
    $ php ./app/console server:run
    * En caso de estar en un virtual:
    $ php ./app/console server:run 0.0.0.0:8000

●   Verificar en navegador:
    http://localhost:8000/
Taller - Instalación
●   Probar módulo demo:
    http://localhost:8000/app_dev.php/demo/

●   Configurar parámetros database:
    http://localhost:8000/app_dev.php/_configu
    rator/
Taller - Creación de bundle
●   Creando nuestro bundle:
    $ php app/console generate:bundle
    Bundle namespace: Blog/BlogBundle
    Bundle name: BlogBundle
    Target directory: ENTER
    Configuration format: yml
    Do you want to generate the whole directory
    structure: no
Taller – Creación de bundle
    Do you confirm generation? yes
    Confirm automatic update of your Kernel? yes
    Confirm automatic update of the Routing? Yes

●   Verificamos que todo salió bien:
    http://localhost:8000/hello/yaroslab
Taller – ¿Qué pasó?
●   Se creó la estructura básica de un bundle en
    src/Blog/BlogBundle

●   Se registró el bundle en el app/AppKernel.php

●   Se agregó el routing.yml del bundle
    BlogBundle en app/config/routing.yml
Taller – Estructura archivos
src/Blog/
└── BlogBundle
  ├── BlogBundle.php
  ├── Controller
  │ └── DefaultController.php
  ├── DependencyInjection
  │ ├── BlogExtension.php
  │ └── Configuration.php
  └── Resources
     ├── config
     │ ├── routing.yml
     │ └── services.yml
     └── views
       └── Default
            └── index.html.twig
Taller - Enrutamiento
●   Editamos
    src/Blog/BlogBundle/Resources/config/rout
    ing.yml agregando:

    blog_lista:
       pattern: /blog
       defaults: { _controller: BlogBundle:Default:blog }
Taller - Controller
●   Editamos
    src/Blog/BlogBundle/Controller/DefaultContr
    oller.php, agregando el método:

    public function blogAction()
    {
       return $this->render('BlogBundle:Default:lista.html.twig',
    array());
    }
Taller - Plantilla
●   Creamos el archivo
    src/Blog/BlogBundle/Resources/views/Default/list
    a.html.twig, con contenido:
    {% extends '::base.html.twig' %}
    {% block title %}Blog{% endblock %}
    {% block body %}
      Blog listado
    {% endblock %}


●   Probar http://localhost:8000/blog
Taller – Modelo - Blog
●
    Crear archivo src/Blog/BlogBundle/Entity/Blog.php
    <?php
    namespace BlogBlogBundleEntity;
    use DoctrineORMMapping as ORM;


    /**
    * @ORMEntity
    */
    class Blog
    {
          /**
          * @ORMId
          * @ORMColumn(type="integer")
          * @ORMGeneratedValue(strategy="AUTO")
          */
          protected $id;
Taller – Modelo - Blog
     /** @ORMColumn(type="string", length=100) */
     protected $titulo;


     /** @ORMColumn(type="text", nullable=True) */
     protected $contenido;


     /**
     * @ORMManyToOne(targetEntity="BlogBlogBundleEntityAutor")
     */
     protected $autor;
 }
Taller – Modelo - Autor
●   Crear archivo src/Blog/BlogBundle/Entity/Autor.php
    <?php
    namespace BlogBlogBundleEntity;
    use DoctrineORMMapping as ORM;
    /**
    * @ORMEntity
    */
    class Autor
    {
          /**
          * @ORMId
          * @ORMColumn(type="integer")
          * @ORMGeneratedValue(strategy="AUTO")
          */
          protected $id;
          /** @ORMColumn(type="string", length=100) */
          protected $nombre;
    }
Taller – Modelo - Autor
●   Agregar el método:


    public function __toString()
    {
        return $this->getNombre();
    }
Taller - Modelo - Entity
●   Agregamos los métodos set/get:
    $ php app/console generate:doctrine:entities
    BlogBundle


●   Creamos database:
    $ php app/console doctrine:database:create


●   Creamos schema:
    $ php app/console doctrine:schema:create
Taller – Listado - Controller
●   Editar src/Blog/BlogBundle/Controller/DefaultController.php

●   Agregamos antes de class:
    use BlogBlogBundleEntityBlog;

●   Actualizamos método blogAction:
    $em = $this->getDoctrine()->getEntityManager();
    $blogs = $em->getRepository('BlogBundle:Blog')->findAll();
    return $this->render('BlogBundle:Default:lista.html.twig', array(
          'blogs' => $blogs,
    ));
Taller - Listado - View
<table cellpadding="0" cellspacing="0" border="0" class="dTable">
  <thead>
    <tr>                   Plantilla:
    <th>Id</th>            src/Blog/BlogBundle/Resources/views/Default/lista.html.twig
    <th>Nombre</th>        Dentro del bloque body
    <th>Acciones</th>
    </tr>
  </thead>
  <tbody>
    {% for blog in blogs %}
    <tr>
       <td>{{ blog.id }}</td>
       <td>{{ blog.titulo }}</td>
       <td>{{ blog.id }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>
Taller - Modelo
●   Insertamos data de forma manual:
    INSERT INTO `Autor` (`id`, `nombre`) VALUES (1,
    'Mario Inga');
    INSERT INTO `Blog` (`id`, `autor_id`, `titulo`,
    `contenido`) VALUES (1, 1, 'Demo', 'Demo
    contenido');


●   Probamos: http://localhost:8000/blog/
Taller - Formulario
●   Crear archivo src/Blog/BlogBundle/Form/BlogType.php
    <?php
    namespace BlogBlogBundleForm;
    use SymfonyComponentFormAbstractType;
    use SymfonyComponentFormFormBuilderInterface;


    class BlogType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('titulo');
            $builder->add('contenido', 'textarea');
            $builder->add('autor');
        }


        public function getName()
        {
            return 'blog';
        }
    }
Taller - Nuevo - Routing
●   Editamos
    src/Blog/BlogBundle/Resources/config/routing.
    yml, agregando al final:


    blog_nuevo:
      pattern: /blog/nuevo
      defaults: { _controller: BlogBundle:Default:nuevo }
Taller - Nuevo - Controller
●   Editar
    src/Blog/BlogBundle/Controller/DefaultCon
    troller.php, agregar antes de class:


    use BlogBlogBundleFormBlogType;

●   Agregar este nuevo método:
Taller - Nuevo - Controller
public function nuevoAction()
  {
      $blog = new Blog();
      $form = $this->createForm(new BlogType(), $blog);


      $request = $this->getRequest();
      if ($request->getMethod() == 'POST') {
      $form->bindRequest($request);


      if ($form->isValid()) {
      $em = $this->getDoctrine()->getEntityManager();
      $em->persist($blog);
      $em->flush();


      return $this->redirect($this->generateUrl('blog_lista'));
      }
      }


  return $this->render('BlogBundle:Default:nuevo.html.twig', array('form' => $form->createView()));
  }
Taller - Nuevo - View
●
    Crear src/Blog/BlogBundle/Resources/views/Default/nuevo.html.twig:


    {% extends '::base.html.twig' %}
    {% block title %}Blog{% endblock %}
    {% block body %}
    <form action="{{ path('blog_nuevo') }}" method="post" {{ form_enctype(form) }}>
      {{ form_widget(form._token) }}
      <table>
         <tr>
           <td>{{ form_label(form.titulo) }}</td>
           <td>{{ form_widget(form.titulo) }}</td>
           {{ form_errors(form.titulo) }}
         <tr>
Taller - Nuevo - View
    <tr>
      <td>{{ form_label(form.contenido) }}</td>
      <td>{{ form_widget(form.contenido) }}</td>
      {{ form_errors(form.contenido) }}
    <tr>
    <tr>
      <td>{{ form_label(form.autor) }}</td>
      <td>{{ form_widget(form.autor) }}</td>
      {{ form_errors(form.autor) }}
    <tr>
    <tr>
      <td colspan="3">
      {{ form_errors(form) }}
      <input type="submit" value="Guardar" />
      </td>
    </tr>
  </table>
</form>
{% endblock %}
Taller - Editar - Routing
●   Agregar src/Blog/BlogBundle/Resources/config/routing.yml


    blog_editar:
      pattern: /blog/editar/{id}
      defaults: { _controller: BlogBundle:Default:editar }
      requirements:
         _method: GET|POST
         id: d+

●   Agregar nuevo método en
    src/Blog/BlogBundle/Controller/DefaultController.php
Taller - Editar - Controller
 public function editarAction($id)
   {
       $em = $this->getDoctrine()->getEntityManager();
       $blog = $em->getRepository('BlogBundle:Blog')->find($id);


       if (!$blog) {
           throw $this->createNotFoundException('No existe blog con id: ' . $id);
       }


       $form = $this->createForm(new BlogType(), $blog);
       $request = $this->getRequest();
Taller- Editar - Controller
     if ($request->getMethod() == 'POST') {
           $form->bindRequest($request);
           if ($form->isValid()) {
               $em = $this->getDoctrine()->getEntityManager();
               $em->persist($blog);
               $em->flush();
               return $this->redirect($this->generateUrl('blog_lista'));
           }
     }


     return $this->render('BlogBundle:Default:editar.html.twig', array(
           'blog' => $blog,
           'form' => $form->createView()
     ));
 }
Taller - Editar - View
 {% extends '::base.html.twig' %}
 {% block title %}Blog{% endblock %}


 {% block body %}
 <form action="{{ path('blog_editar', {'id': blog.id}) }}" method="post"
 {{ form_enctype(form) }}>
   {{ form_widget(form._token) }}
   <table>
      <tr>
         <td>{{ form_label(form.titulo) }}</td>
         <td>{{ form_widget(form.titulo) }}</td>
         {{ form_errors(form.titulo) }}
      <tr>
Taller - Editar - View
    <tr>
      <td>{{ form_label(form.contenido) }}</td>
      <td>{{ form_widget(form.contenido) }}</td>
      {{ form_errors(form.contenido) }}
    <tr>
    <tr>
      <td colspan="3">
      {{ form_errors(form) }}
      <input type="submit" value="Guardar" />
      </td>
    </tr>
  </table>
</form>
{% endblock %}
Taller - Eliminar - Routing
●   Editar src/Blog/BlogBundle/Resources/config/routing.yml,
    agregar al final:


    blog_eliminar:
      pattern: /blog/eliminar/{id}
      defaults: { _controller: BlogBundle:Blog:eliminar }
      requirements:
        _method: GET|POST
        id: d+
Taller - Eliminar - Controller
●   Agregar método al controller
    src/Blog/BlogBundle/Controller/DefaultController.php:


    public function eliminarAction($id)
      {
          $em = $this->getDoctrine()->getEntityManager();
          $blog = $em->getRepository('BlogBundle:Blog')->find($id);
          $em->remove($blog);
          $em->flush();


          return $this->redirect($this->generateUrl('blog_lista'));
      }
Taller - Listado - View
●   Actualizar vista src/Blog/BlogBundle/Resources/views/Default/lista.html.twig


    {% extends '::base.html.twig' %}
    {% block title %}Blog{% endblock %}


    {% block body %}
      <a href="{{ path('blog_nuevo') }}">Nuevo</a>
      <table cellpadding="0" cellspacing="0" border="0" class="dTable">
         <thead>
           <tr>
              <th>Id</th>
              <th>Nombre</th>
              <th>Acciones</th>
           </tr>
         </thead>
Taller - Listado - View
    <tbody>
      {% for blog in blogs %}
      <tr>
         <td>{{ blog.id }}</td>
         <td>{{ blog.titulo }}</td>
         <td>
              <a href="{{ path('blog_editar', { 'id': blog.id }) }}">Editar</a>
              |
              <a href="{{ path('blog_eliminar', { 'id': blog.id }) }}">Eliminar</a>
         </td>
      </tr>
      {% endfor %}
    </tbody>
  </table>
{% endblock %}
Links
●   https://github.com/mario21ic/symfony2_taller.g
    it
●   http://symfony.com/doc/current/index.html
●   http://www.maestrosdelweb.com/editorial/curs
    o-symfony2-introduccion-instalacion/
●   http://gitnacho.github.com/symfony-docs-es/
●   http://getcomposer.org/
¿Preguntas?

Weitere ähnliche Inhalte

Was ist angesagt?

Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendmenttes
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaAgencia INNN
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosaFco Javier Núñez Berrocoso
 
Chamilo para-desarrolladores-1.9
Chamilo para-desarrolladores-1.9Chamilo para-desarrolladores-1.9
Chamilo para-desarrolladores-1.9Chamilo Association
 
Desarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfonyDesarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfonyJuan Eladio Sánchez Rosas
 
Frontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsFrontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsDavid Ballén
 
Las buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones SymfonyLas buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones Symfonysymfony_bcn
 
Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Edgar Dueñas
 
Reactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJSReactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJSJavier Abadía
 
Taller de Django betabeers
Taller de Django betabeersTaller de Django betabeers
Taller de Django betabeersbetabeers
 
Adentrándonos al Framework Symfony
Adentrándonos al  Framework SymfonyAdentrándonos al  Framework Symfony
Adentrándonos al Framework SymfonyRodrigo Miranda
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoJuan Rodríguez
 
Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Raul Fraile
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPDaniel Primo
 
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...betabeers
 
Despliegue de aplicaciones PHP
Despliegue de aplicaciones PHPDespliegue de aplicaciones PHP
Despliegue de aplicaciones PHPAlicantePHP
 

Was ist angesagt? (20)

Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevilla
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
 
Chamilo para-desarrolladores-1.9
Chamilo para-desarrolladores-1.9Chamilo para-desarrolladores-1.9
Chamilo para-desarrolladores-1.9
 
Desarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfonyDesarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfony
 
Frontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsFrontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para Frontends
 
Las buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones SymfonyLas buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones Symfony
 
Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2
 
Reactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJSReactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJS
 
Taller de Django betabeers
Taller de Django betabeersTaller de Django betabeers
Taller de Django betabeers
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
9.laravel
9.laravel9.laravel
9.laravel
 
Adentrándonos al Framework Symfony
Adentrándonos al  Framework SymfonyAdentrándonos al  Framework Symfony
Adentrándonos al Framework Symfony
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con Django
 
Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Symfony2: Framework para PHP5
Symfony2: Framework para PHP5
 
CRUD básico con Symfony
CRUD básico con SymfonyCRUD básico con Symfony
CRUD básico con Symfony
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
 
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
 
Gestionando servidores con Puppet
Gestionando servidores con PuppetGestionando servidores con Puppet
Gestionando servidores con Puppet
 
Despliegue de aplicaciones PHP
Despliegue de aplicaciones PHPDespliegue de aplicaciones PHP
Despliegue de aplicaciones PHP
 

Ähnlich wie Introducción a Symfony2

Joomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesJoomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesdeivit86
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPHP Vigo
 
Anatomía de implementación de un LCMS basado en moodle
Anatomía de implementación de un LCMS basado en moodleAnatomía de implementación de un LCMS basado en moodle
Anatomía de implementación de un LCMS basado en moodleJosé Luis Granda
 
Vue + Typescript: Decorators vs. Extend, Fight!
Vue + Typescript: Decorators vs. Extend, Fight!Vue + Typescript: Decorators vs. Extend, Fight!
Vue + Typescript: Decorators vs. Extend, Fight!Sara Lissette L. Ibáñez
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytestHector Canto
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controllerhydras_cs
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y BackEric Zeidan
 
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdfPHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdfRaaulroodriguez
 
Symfony2 Formacion y primeros pasos
Symfony2  Formacion y primeros pasosSymfony2  Formacion y primeros pasos
Symfony2 Formacion y primeros pasosSoni BM
 
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...Asociación Webmasters Cantabria
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryJavier P.
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasoshydras_cs
 
Masterclass ADWE Madrid
Masterclass ADWE MadridMasterclass ADWE Madrid
Masterclass ADWE MadridKubide
 
Formación para certificado de administradores
Formación para certificado de administradoresFormación para certificado de administradores
Formación para certificado de administradoresChamilo Association
 

Ähnlich wie Introducción a Symfony2 (20)

Joomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesJoomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensiones
 
APIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptxAPIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptx
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigo
 
Anatomía de implementación de un LCMS basado en moodle
Anatomía de implementación de un LCMS basado en moodleAnatomía de implementación de un LCMS basado en moodle
Anatomía de implementación de un LCMS basado en moodle
 
Django
DjangoDjango
Django
 
wp-cli
wp-cliwp-cli
wp-cli
 
Introducción a Kohana Framework
Introducción a Kohana FrameworkIntroducción a Kohana Framework
Introducción a Kohana Framework
 
Vue + Typescript: Decorators vs. Extend, Fight!
Vue + Typescript: Decorators vs. Extend, Fight!Vue + Typescript: Decorators vs. Extend, Fight!
Vue + Typescript: Decorators vs. Extend, Fight!
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytest
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y Back
 
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdfPHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
 
Symfony2 Formacion y primeros pasos
Symfony2  Formacion y primeros pasosSymfony2  Formacion y primeros pasos
Symfony2 Formacion y primeros pasos
 
Site building
Site buildingSite building
Site building
 
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasos
 
Masterclass ADWE Madrid
Masterclass ADWE MadridMasterclass ADWE Madrid
Masterclass ADWE Madrid
 
Formación para certificado de administradores
Formación para certificado de administradoresFormación para certificado de administradores
Formación para certificado de administradores
 
Joomla 1.5: desarrollo de componentes
Joomla 1.5: desarrollo de componentesJoomla 1.5: desarrollo de componentes
Joomla 1.5: desarrollo de componentes
 

Mehr von Mario IC

Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...Mario IC
 
Aws Security Latam - Criptografia con KMS
Aws Security Latam - Criptografia con KMSAws Security Latam - Criptografia con KMS
Aws Security Latam - Criptografia con KMSMario IC
 
Aws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMSAws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMSMario IC
 
Testing Ansible Playbook con Molecule + TestInfra
Testing Ansible Playbook con Molecule + TestInfraTesting Ansible Playbook con Molecule + TestInfra
Testing Ansible Playbook con Molecule + TestInfraMario IC
 
Automatización de tareas con Ansible
Automatización de tareas con AnsibleAutomatización de tareas con Ansible
Automatización de tareas con AnsibleMario IC
 
Earthly, Dockerfile con esteroides
Earthly, Dockerfile con esteroidesEarthly, Dockerfile con esteroides
Earthly, Dockerfile con esteroidesMario IC
 
Infraestructura como Codigo para Developers
Infraestructura como Codigo para DevelopersInfraestructura como Codigo para Developers
Infraestructura como Codigo para DevelopersMario IC
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkMario IC
 
Manejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmManejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmMario IC
 
Cloud native Computing Perú Octubre
Cloud native Computing Perú OctubreCloud native Computing Perú Octubre
Cloud native Computing Perú OctubreMario IC
 
Agiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeAgiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeMario IC
 
Workshop Infrastructure as Code - Suestra
Workshop Infrastructure as Code - SuestraWorkshop Infrastructure as Code - Suestra
Workshop Infrastructure as Code - SuestraMario IC
 
Docker Compose to Production with Docker Swarm
Docker Compose to Production with Docker SwarmDocker Compose to Production with Docker Swarm
Docker Compose to Production with Docker SwarmMario IC
 
GDG Lima - Docker Compose
GDG Lima - Docker ComposeGDG Lima - Docker Compose
GDG Lima - Docker ComposeMario IC
 
Docker Lima meetup - 22 de junio
Docker Lima meetup - 22 de junioDocker Lima meetup - 22 de junio
Docker Lima meetup - 22 de junioMario IC
 
Docker Compose para el Docker Lima Meetup Mayo
Docker Compose para el Docker Lima Meetup MayoDocker Compose para el Docker Lima Meetup Mayo
Docker Compose para el Docker Lima Meetup MayoMario IC
 
Testing en BDD con Python y Behave
Testing en BDD con Python y BehaveTesting en BDD con Python y Behave
Testing en BDD con Python y BehaveMario IC
 
Infrastructure as Code with Terraform
Infrastructure as Code with TerraformInfrastructure as Code with Terraform
Infrastructure as Code with TerraformMario IC
 
Docker Birthday Peru #dockerbday
Docker Birthday Peru #dockerbdayDocker Birthday Peru #dockerbday
Docker Birthday Peru #dockerbdayMario IC
 
Modelado de API con RAML
Modelado de API con RAMLModelado de API con RAML
Modelado de API con RAMLMario IC
 

Mehr von Mario IC (20)

Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
 
Aws Security Latam - Criptografia con KMS
Aws Security Latam - Criptografia con KMSAws Security Latam - Criptografia con KMS
Aws Security Latam - Criptografia con KMS
 
Aws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMSAws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMS
 
Testing Ansible Playbook con Molecule + TestInfra
Testing Ansible Playbook con Molecule + TestInfraTesting Ansible Playbook con Molecule + TestInfra
Testing Ansible Playbook con Molecule + TestInfra
 
Automatización de tareas con Ansible
Automatización de tareas con AnsibleAutomatización de tareas con Ansible
Automatización de tareas con Ansible
 
Earthly, Dockerfile con esteroides
Earthly, Dockerfile con esteroidesEarthly, Dockerfile con esteroides
Earthly, Dockerfile con esteroides
 
Infraestructura como Codigo para Developers
Infraestructura como Codigo para DevelopersInfraestructura como Codigo para Developers
Infraestructura como Codigo para Developers
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform framework
 
Manejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmManejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con Helm
 
Cloud native Computing Perú Octubre
Cloud native Computing Perú OctubreCloud native Computing Perú Octubre
Cloud native Computing Perú Octubre
 
Agiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeAgiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As Code
 
Workshop Infrastructure as Code - Suestra
Workshop Infrastructure as Code - SuestraWorkshop Infrastructure as Code - Suestra
Workshop Infrastructure as Code - Suestra
 
Docker Compose to Production with Docker Swarm
Docker Compose to Production with Docker SwarmDocker Compose to Production with Docker Swarm
Docker Compose to Production with Docker Swarm
 
GDG Lima - Docker Compose
GDG Lima - Docker ComposeGDG Lima - Docker Compose
GDG Lima - Docker Compose
 
Docker Lima meetup - 22 de junio
Docker Lima meetup - 22 de junioDocker Lima meetup - 22 de junio
Docker Lima meetup - 22 de junio
 
Docker Compose para el Docker Lima Meetup Mayo
Docker Compose para el Docker Lima Meetup MayoDocker Compose para el Docker Lima Meetup Mayo
Docker Compose para el Docker Lima Meetup Mayo
 
Testing en BDD con Python y Behave
Testing en BDD con Python y BehaveTesting en BDD con Python y Behave
Testing en BDD con Python y Behave
 
Infrastructure as Code with Terraform
Infrastructure as Code with TerraformInfrastructure as Code with Terraform
Infrastructure as Code with Terraform
 
Docker Birthday Peru #dockerbday
Docker Birthday Peru #dockerbdayDocker Birthday Peru #dockerbday
Docker Birthday Peru #dockerbday
 
Modelado de API con RAML
Modelado de API con RAMLModelado de API con RAML
Modelado de API con RAML
 

Kürzlich hochgeladen

Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel tallerValentinaTabares11
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzzAlexandergo5
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificialcynserafini89
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesEdomar AR
 

Kürzlich hochgeladen (20)

Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel taller
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzz
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificial
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, Aplicaciones
 

Introducción a Symfony2

  • 1. Introducción a Symfony2 Por: Mario J. Inga Cahuana @mario21ic
  • 2. Agenda ● ¿Qué és? ● Características ● Arquitectura MVC ● Flujo de apps ● Componentes ● Bundle ● Taller ● Links ● Preguntas
  • 3. ¿Qué es Symfony2? ● Creado por la comunidad y liderada por Fabien Potencier ● Desarrollado en PHP 5.3 ● Arquitectura MVC ● Predecesor de Symfony 1 ● Agrupación en bundle ● Configuración en: YAML, XML, PHP
  • 4. Características ● Alto rendimiento ● Usabilidad avanzada ● Extensible ● Flexible ● Contruido para desarrolladores ● Construido en base a otros grandes frameworks ● Listo para usar ● OpenSource
  • 5. Arquitectura Symfony2 ● MVC: Modelo, Vista y Controlador ● Controlador: Symfony2 ● Modelo: Doctrine, ORM basado en Hibernate ● Vista: Twig, basado en plantillas de Django
  • 6. Flujo de apps Symfony2
  • 7. Componentes ● HttpFoundation: Contiene las clases Petición y Respuesta, así como otras clases para manejar sesiones y cargar archivos ● Enrutado: Potente y rápido sistema de enrutamiento que te permite asociar una URI específica (por ejemplo /contacto) a cierta información acerca de cómo se debe manejar esa petición (por ejemplo, ejecutando el método contactoAction()) ● Form: Una completa y flexible plataforma para crear formularios y procesar los datos presentados en ellos ● Validator: Un sistema para crear reglas sobre datos y entonces, cuando el usuario presenta los datos comprobar si son válidos o no siguiendo esas reglas
  • 8. Componentes ● Classloader: Una biblioteca de carga automática que permite utilizar clases PHP sin necesidad de require los archivos que contienen esas clases manualmente; ● Plantillas: Un juego de herramientas para reproducir plantillas, manejar la herencia de plantillas (es decir, una plantilla es decorada con un diseño) y realizar otras tareas comunes de las plantillas ● Security: Una poderosa biblioteca para manejar todo tipo de seguridad dentro de una aplicación ● Translation: Una plataforma para traducir cadenas en tu aplicación
  • 9. Bundle ● Los bundles son la base de la nueva filosofía de trabajo de Symfony2. El código de tus aplicaciones y el propio código fuente de Symfony2 se estructura mediante bundles. ● Técnicamente, un bundle es un directorio que contiene todo tipo de archivos dentro una estructura jerarquizada de directorios, que suelen contener clases PHP y archivos web (JavaScript, CSS e imágenes).
  • 10. Taller ● Objetivo: Realizar un pequeño CRUD con 2 modelos relacionados. ● Requisitos: Linux, PHP 5.4, MySQL o PostgreSQL, Git
  • 11. Taller - Instalación ● Instalando con composer: $ curl -s https://getcomposer.org/installer | php $ composer.phar create-project symfony/framework- standard-edition symfony2_taller 2.1.7 ● Descargando: $ wget http://symfony.com/download? v=Symfony_Standard_Vendors_2.1.7.tgz $ tar -xvf Symfony_Standard_2.0.16.tgz
  • 12. Taller - Instalación ● Verificar requerimientos: $ php app/check.php ● Correr el server: $ php ./app/console server:run * En caso de estar en un virtual: $ php ./app/console server:run 0.0.0.0:8000 ● Verificar en navegador: http://localhost:8000/
  • 13. Taller - Instalación ● Probar módulo demo: http://localhost:8000/app_dev.php/demo/ ● Configurar parámetros database: http://localhost:8000/app_dev.php/_configu rator/
  • 14. Taller - Creación de bundle ● Creando nuestro bundle: $ php app/console generate:bundle Bundle namespace: Blog/BlogBundle Bundle name: BlogBundle Target directory: ENTER Configuration format: yml Do you want to generate the whole directory structure: no
  • 15. Taller – Creación de bundle Do you confirm generation? yes Confirm automatic update of your Kernel? yes Confirm automatic update of the Routing? Yes ● Verificamos que todo salió bien: http://localhost:8000/hello/yaroslab
  • 16. Taller – ¿Qué pasó? ● Se creó la estructura básica de un bundle en src/Blog/BlogBundle ● Se registró el bundle en el app/AppKernel.php ● Se agregó el routing.yml del bundle BlogBundle en app/config/routing.yml
  • 17. Taller – Estructura archivos src/Blog/ └── BlogBundle ├── BlogBundle.php ├── Controller │ └── DefaultController.php ├── DependencyInjection │ ├── BlogExtension.php │ └── Configuration.php └── Resources ├── config │ ├── routing.yml │ └── services.yml └── views └── Default └── index.html.twig
  • 18. Taller - Enrutamiento ● Editamos src/Blog/BlogBundle/Resources/config/rout ing.yml agregando: blog_lista: pattern: /blog defaults: { _controller: BlogBundle:Default:blog }
  • 19. Taller - Controller ● Editamos src/Blog/BlogBundle/Controller/DefaultContr oller.php, agregando el método: public function blogAction() { return $this->render('BlogBundle:Default:lista.html.twig', array()); }
  • 20. Taller - Plantilla ● Creamos el archivo src/Blog/BlogBundle/Resources/views/Default/list a.html.twig, con contenido: {% extends '::base.html.twig' %} {% block title %}Blog{% endblock %} {% block body %} Blog listado {% endblock %} ● Probar http://localhost:8000/blog
  • 21. Taller – Modelo - Blog ● Crear archivo src/Blog/BlogBundle/Entity/Blog.php <?php namespace BlogBlogBundleEntity; use DoctrineORMMapping as ORM; /** * @ORMEntity */ class Blog { /** * @ORMId * @ORMColumn(type="integer") * @ORMGeneratedValue(strategy="AUTO") */ protected $id;
  • 22. Taller – Modelo - Blog /** @ORMColumn(type="string", length=100) */ protected $titulo; /** @ORMColumn(type="text", nullable=True) */ protected $contenido; /** * @ORMManyToOne(targetEntity="BlogBlogBundleEntityAutor") */ protected $autor; }
  • 23. Taller – Modelo - Autor ● Crear archivo src/Blog/BlogBundle/Entity/Autor.php <?php namespace BlogBlogBundleEntity; use DoctrineORMMapping as ORM; /** * @ORMEntity */ class Autor { /** * @ORMId * @ORMColumn(type="integer") * @ORMGeneratedValue(strategy="AUTO") */ protected $id; /** @ORMColumn(type="string", length=100) */ protected $nombre; }
  • 24. Taller – Modelo - Autor ● Agregar el método: public function __toString() { return $this->getNombre(); }
  • 25. Taller - Modelo - Entity ● Agregamos los métodos set/get: $ php app/console generate:doctrine:entities BlogBundle ● Creamos database: $ php app/console doctrine:database:create ● Creamos schema: $ php app/console doctrine:schema:create
  • 26. Taller – Listado - Controller ● Editar src/Blog/BlogBundle/Controller/DefaultController.php ● Agregamos antes de class: use BlogBlogBundleEntityBlog; ● Actualizamos método blogAction: $em = $this->getDoctrine()->getEntityManager(); $blogs = $em->getRepository('BlogBundle:Blog')->findAll(); return $this->render('BlogBundle:Default:lista.html.twig', array( 'blogs' => $blogs, ));
  • 27. Taller - Listado - View <table cellpadding="0" cellspacing="0" border="0" class="dTable"> <thead> <tr> Plantilla: <th>Id</th> src/Blog/BlogBundle/Resources/views/Default/lista.html.twig <th>Nombre</th> Dentro del bloque body <th>Acciones</th> </tr> </thead> <tbody> {% for blog in blogs %} <tr> <td>{{ blog.id }}</td> <td>{{ blog.titulo }}</td> <td>{{ blog.id }}</td> </tr> {% endfor %} </tbody> </table>
  • 28. Taller - Modelo ● Insertamos data de forma manual: INSERT INTO `Autor` (`id`, `nombre`) VALUES (1, 'Mario Inga'); INSERT INTO `Blog` (`id`, `autor_id`, `titulo`, `contenido`) VALUES (1, 1, 'Demo', 'Demo contenido'); ● Probamos: http://localhost:8000/blog/
  • 29. Taller - Formulario ● Crear archivo src/Blog/BlogBundle/Form/BlogType.php <?php namespace BlogBlogBundleForm; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; class BlogType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('titulo'); $builder->add('contenido', 'textarea'); $builder->add('autor'); } public function getName() { return 'blog'; } }
  • 30. Taller - Nuevo - Routing ● Editamos src/Blog/BlogBundle/Resources/config/routing. yml, agregando al final: blog_nuevo: pattern: /blog/nuevo defaults: { _controller: BlogBundle:Default:nuevo }
  • 31. Taller - Nuevo - Controller ● Editar src/Blog/BlogBundle/Controller/DefaultCon troller.php, agregar antes de class: use BlogBlogBundleFormBlogType; ● Agregar este nuevo método:
  • 32. Taller - Nuevo - Controller public function nuevoAction() { $blog = new Blog(); $form = $this->createForm(new BlogType(), $blog); $request = $this->getRequest(); if ($request->getMethod() == 'POST') { $form->bindRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getEntityManager(); $em->persist($blog); $em->flush(); return $this->redirect($this->generateUrl('blog_lista')); } } return $this->render('BlogBundle:Default:nuevo.html.twig', array('form' => $form->createView())); }
  • 33. Taller - Nuevo - View ● Crear src/Blog/BlogBundle/Resources/views/Default/nuevo.html.twig: {% extends '::base.html.twig' %} {% block title %}Blog{% endblock %} {% block body %} <form action="{{ path('blog_nuevo') }}" method="post" {{ form_enctype(form) }}> {{ form_widget(form._token) }} <table> <tr> <td>{{ form_label(form.titulo) }}</td> <td>{{ form_widget(form.titulo) }}</td> {{ form_errors(form.titulo) }} <tr>
  • 34. Taller - Nuevo - View <tr> <td>{{ form_label(form.contenido) }}</td> <td>{{ form_widget(form.contenido) }}</td> {{ form_errors(form.contenido) }} <tr> <tr> <td>{{ form_label(form.autor) }}</td> <td>{{ form_widget(form.autor) }}</td> {{ form_errors(form.autor) }} <tr> <tr> <td colspan="3"> {{ form_errors(form) }} <input type="submit" value="Guardar" /> </td> </tr> </table> </form> {% endblock %}
  • 35. Taller - Editar - Routing ● Agregar src/Blog/BlogBundle/Resources/config/routing.yml blog_editar: pattern: /blog/editar/{id} defaults: { _controller: BlogBundle:Default:editar } requirements: _method: GET|POST id: d+ ● Agregar nuevo método en src/Blog/BlogBundle/Controller/DefaultController.php
  • 36. Taller - Editar - Controller public function editarAction($id) { $em = $this->getDoctrine()->getEntityManager(); $blog = $em->getRepository('BlogBundle:Blog')->find($id); if (!$blog) { throw $this->createNotFoundException('No existe blog con id: ' . $id); } $form = $this->createForm(new BlogType(), $blog); $request = $this->getRequest();
  • 37. Taller- Editar - Controller if ($request->getMethod() == 'POST') { $form->bindRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getEntityManager(); $em->persist($blog); $em->flush(); return $this->redirect($this->generateUrl('blog_lista')); } } return $this->render('BlogBundle:Default:editar.html.twig', array( 'blog' => $blog, 'form' => $form->createView() )); }
  • 38. Taller - Editar - View {% extends '::base.html.twig' %} {% block title %}Blog{% endblock %} {% block body %} <form action="{{ path('blog_editar', {'id': blog.id}) }}" method="post" {{ form_enctype(form) }}> {{ form_widget(form._token) }} <table> <tr> <td>{{ form_label(form.titulo) }}</td> <td>{{ form_widget(form.titulo) }}</td> {{ form_errors(form.titulo) }} <tr>
  • 39. Taller - Editar - View <tr> <td>{{ form_label(form.contenido) }}</td> <td>{{ form_widget(form.contenido) }}</td> {{ form_errors(form.contenido) }} <tr> <tr> <td colspan="3"> {{ form_errors(form) }} <input type="submit" value="Guardar" /> </td> </tr> </table> </form> {% endblock %}
  • 40. Taller - Eliminar - Routing ● Editar src/Blog/BlogBundle/Resources/config/routing.yml, agregar al final: blog_eliminar: pattern: /blog/eliminar/{id} defaults: { _controller: BlogBundle:Blog:eliminar } requirements: _method: GET|POST id: d+
  • 41. Taller - Eliminar - Controller ● Agregar método al controller src/Blog/BlogBundle/Controller/DefaultController.php: public function eliminarAction($id) { $em = $this->getDoctrine()->getEntityManager(); $blog = $em->getRepository('BlogBundle:Blog')->find($id); $em->remove($blog); $em->flush(); return $this->redirect($this->generateUrl('blog_lista')); }
  • 42. Taller - Listado - View ● Actualizar vista src/Blog/BlogBundle/Resources/views/Default/lista.html.twig {% extends '::base.html.twig' %} {% block title %}Blog{% endblock %} {% block body %} <a href="{{ path('blog_nuevo') }}">Nuevo</a> <table cellpadding="0" cellspacing="0" border="0" class="dTable"> <thead> <tr> <th>Id</th> <th>Nombre</th> <th>Acciones</th> </tr> </thead>
  • 43. Taller - Listado - View <tbody> {% for blog in blogs %} <tr> <td>{{ blog.id }}</td> <td>{{ blog.titulo }}</td> <td> <a href="{{ path('blog_editar', { 'id': blog.id }) }}">Editar</a> | <a href="{{ path('blog_eliminar', { 'id': blog.id }) }}">Eliminar</a> </td> </tr> {% endfor %} </tbody> </table> {% endblock %}
  • 44. Links ● https://github.com/mario21ic/symfony2_taller.g it ● http://symfony.com/doc/current/index.html ● http://www.maestrosdelweb.com/editorial/curs o-symfony2-introduccion-instalacion/ ● http://gitnacho.github.com/symfony-docs-es/ ● http://getcomposer.org/