SlideShare a Scribd company logo
1 of 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?

More Related Content

What's hot

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
 

What's hot (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
 

Similar to Taller introduccion 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
 

Similar to Taller introduccion 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
 

More from 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
 

More from 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
 

Recently uploaded

PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...dramosbrise1403
 
avancestecnologicossigloveintiunoprofetengohambreayuda
avancestecnologicossigloveintiunoprofetengohambreayudaavancestecnologicossigloveintiunoprofetengohambreayuda
avancestecnologicossigloveintiunoprofetengohambreayudadocente
 
De Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptxDe Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptxdoloresolmosantiago
 
editorial de informática de los sueños.docx
editorial de informática de los sueños.docxeditorial de informática de los sueños.docx
editorial de informática de los sueños.docxssusere34b451
 
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUALJORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUALGuadalinfoHuscarGuad
 
herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaJadeVilcscordova
 
Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.241534381
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024NicolleAndrade7
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxJOELGARCIA849853
 
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfRedes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfJosAndrRosarioVzquez
 
Electricidad Libro compendio de temas estudiados.docx
Electricidad Libro compendio de temas estudiados.docxElectricidad Libro compendio de temas estudiados.docx
Electricidad Libro compendio de temas estudiados.docxCsarNlsonMrquezContr
 
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiCVelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC6dwwcgtpfx
 
Imágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónImágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónUniversidad de Sonora
 
el uso de las TIC en la vida cotidiana.pptx
el uso de las TIC en la vida cotidiana.pptxel uso de las TIC en la vida cotidiana.pptx
el uso de las TIC en la vida cotidiana.pptx221112876
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosYOMIRAVILLARREAL1
 
innovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 bloginnovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 blogManuel Diaz
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxcj12paz
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaRicardoEstrada90
 
BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).jcaballerosamayoa
 
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónNavegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónAntonia Yamilet Perez Palomares
 

Recently uploaded (20)

PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
 
avancestecnologicossigloveintiunoprofetengohambreayuda
avancestecnologicossigloveintiunoprofetengohambreayudaavancestecnologicossigloveintiunoprofetengohambreayuda
avancestecnologicossigloveintiunoprofetengohambreayuda
 
De Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptxDe Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptx
 
editorial de informática de los sueños.docx
editorial de informática de los sueños.docxeditorial de informática de los sueños.docx
editorial de informática de los sueños.docx
 
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUALJORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
 
herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el tema
 
Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
 
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfRedes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
 
Electricidad Libro compendio de temas estudiados.docx
Electricidad Libro compendio de temas estudiados.docxElectricidad Libro compendio de temas estudiados.docx
Electricidad Libro compendio de temas estudiados.docx
 
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiCVelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
 
Imágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónImágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la información
 
el uso de las TIC en la vida cotidiana.pptx
el uso de las TIC en la vida cotidiana.pptxel uso de las TIC en la vida cotidiana.pptx
el uso de las TIC en la vida cotidiana.pptx
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de Datos
 
innovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 bloginnovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 blog
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptx
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - Estrada
 
BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).
 
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónNavegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
 

Taller introduccion 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/