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

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 

Recently uploaded (10)

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 

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/