SlideShare una empresa de Scribd logo
1 de 45
Descargar para leer sin conexión
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?

Más contenido relacionado

La actualidad más candente

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
 

La actualidad más candente (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 a Introducción a Symfony2

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

Similar a Introducción a Symfony2 (20)

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

Más de 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
 
Docker Ecosystem: Part V - Docker Registry
Docker Ecosystem: Part V - Docker RegistryDocker Ecosystem: Part V - Docker Registry
Docker Ecosystem: Part V - Docker RegistryMario IC
 

Más de Mario IC (20)

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
 
Docker Ecosystem: Part V - Docker Registry
Docker Ecosystem: Part V - Docker RegistryDocker Ecosystem: Part V - Docker Registry
Docker Ecosystem: Part V - Docker Registry
 

Último

base de datos para tecnología de sara Garzón
base de datos para tecnología de sara Garzónbase de datos para tecnología de sara Garzón
base de datos para tecnología de sara GarzónSaraGarzon13
 
Materiales didácticos de Arelis y maria.
Materiales didácticos de Arelis y maria.Materiales didácticos de Arelis y maria.
Materiales didácticos de Arelis y maria.cabreraarelis37
 
LISTA taller tecnología Sofia nava 11-2 año 2024
LISTA taller tecnología Sofia nava 11-2 año 2024LISTA taller tecnología Sofia nava 11-2 año 2024
LISTA taller tecnología Sofia nava 11-2 año 2024SofaNava1
 
tecnologia116.docx TRABAJO COLABORTIVO PRIMNER
tecnologia116.docx TRABAJO COLABORTIVO PRIMNERtecnologia116.docx TRABAJO COLABORTIVO PRIMNER
tecnologia116.docx TRABAJO COLABORTIVO PRIMNERedepmariaordonez
 
TRABAJO TECNOLOGÍA E INFORMATICA TABLAAA
TRABAJO TECNOLOGÍA E INFORMATICA TABLAAATRABAJO TECNOLOGÍA E INFORMATICA TABLAAA
TRABAJO TECNOLOGÍA E INFORMATICA TABLAAASebastinOrdez4
 
LA ELECTRICIDAD Y LA ELECTRÓNICA TRABAJO EN GRUPO
LA ELECTRICIDAD Y LA ELECTRÓNICA TRABAJO EN GRUPOLA ELECTRICIDAD Y LA ELECTRÓNICA TRABAJO EN GRUPO
LA ELECTRICIDAD Y LA ELECTRÓNICA TRABAJO EN GRUPOv16959670
 
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxBLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxhellendiaz12
 
Taller de tecnología año 2024 11-2 sofia nava
Taller de tecnología año 2024  11-2 sofia navaTaller de tecnología año 2024  11-2 sofia nava
Taller de tecnología año 2024 11-2 sofia navaSofaNava1
 
tecnologia11-6 Juan Sebastián Gonzalez liceo
tecnologia11-6 Juan Sebastián Gonzalez liceotecnologia11-6 Juan Sebastián Gonzalez liceo
tecnologia11-6 Juan Sebastián Gonzalez liceoSebastinOrdez4
 
Tecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaTecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaElizabethLpezSoto
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nóminacuellosameidy
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
tecnologia trabajo sobre excel avanzado método estadístico
tecnologia trabajo sobre excel avanzado método estadísticotecnologia trabajo sobre excel avanzado método estadístico
tecnologia trabajo sobre excel avanzado método estadísticojuliana280780
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskbydaniela5
 
.Informe electricidad y electronica.docx
.Informe electricidad y electronica.docx.Informe electricidad y electronica.docx
.Informe electricidad y electronica.docxCamila Ortiz
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
Análisis de Artefactos Tecnologicos .docx
Análisis de Artefactos Tecnologicos .docxAnálisis de Artefactos Tecnologicos .docx
Análisis de Artefactos Tecnologicos .docxmajovaru19
 
La electricidad y la electrónica saray 10-2
La electricidad y la electrónica saray 10-2La electricidad y la electrónica saray 10-2
La electricidad y la electrónica saray 10-2SariGarcs
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaYeimys Ch
 
JUANITA Y SEBASTIAN TRABAJO TEGNOLOGIA TABLA EXCEL
JUANITA Y SEBASTIAN TRABAJO TEGNOLOGIA TABLA EXCELJUANITA Y SEBASTIAN TRABAJO TEGNOLOGIA TABLA EXCEL
JUANITA Y SEBASTIAN TRABAJO TEGNOLOGIA TABLA EXCELSebastinOrdez4
 

Último (20)

base de datos para tecnología de sara Garzón
base de datos para tecnología de sara Garzónbase de datos para tecnología de sara Garzón
base de datos para tecnología de sara Garzón
 
Materiales didácticos de Arelis y maria.
Materiales didácticos de Arelis y maria.Materiales didácticos de Arelis y maria.
Materiales didácticos de Arelis y maria.
 
LISTA taller tecnología Sofia nava 11-2 año 2024
LISTA taller tecnología Sofia nava 11-2 año 2024LISTA taller tecnología Sofia nava 11-2 año 2024
LISTA taller tecnología Sofia nava 11-2 año 2024
 
tecnologia116.docx TRABAJO COLABORTIVO PRIMNER
tecnologia116.docx TRABAJO COLABORTIVO PRIMNERtecnologia116.docx TRABAJO COLABORTIVO PRIMNER
tecnologia116.docx TRABAJO COLABORTIVO PRIMNER
 
TRABAJO TECNOLOGÍA E INFORMATICA TABLAAA
TRABAJO TECNOLOGÍA E INFORMATICA TABLAAATRABAJO TECNOLOGÍA E INFORMATICA TABLAAA
TRABAJO TECNOLOGÍA E INFORMATICA TABLAAA
 
LA ELECTRICIDAD Y LA ELECTRÓNICA TRABAJO EN GRUPO
LA ELECTRICIDAD Y LA ELECTRÓNICA TRABAJO EN GRUPOLA ELECTRICIDAD Y LA ELECTRÓNICA TRABAJO EN GRUPO
LA ELECTRICIDAD Y LA ELECTRÓNICA TRABAJO EN GRUPO
 
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxBLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
 
Taller de tecnología año 2024 11-2 sofia nava
Taller de tecnología año 2024  11-2 sofia navaTaller de tecnología año 2024  11-2 sofia nava
Taller de tecnología año 2024 11-2 sofia nava
 
tecnologia11-6 Juan Sebastián Gonzalez liceo
tecnologia11-6 Juan Sebastián Gonzalez liceotecnologia11-6 Juan Sebastián Gonzalez liceo
tecnologia11-6 Juan Sebastián Gonzalez liceo
 
Tecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaTecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestría
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nómina
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
tecnologia trabajo sobre excel avanzado método estadístico
tecnologia trabajo sobre excel avanzado método estadísticotecnologia trabajo sobre excel avanzado método estadístico
tecnologia trabajo sobre excel avanzado método estadístico
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
 
.Informe electricidad y electronica.docx
.Informe electricidad y electronica.docx.Informe electricidad y electronica.docx
.Informe electricidad y electronica.docx
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
Análisis de Artefactos Tecnologicos .docx
Análisis de Artefactos Tecnologicos .docxAnálisis de Artefactos Tecnologicos .docx
Análisis de Artefactos Tecnologicos .docx
 
La electricidad y la electrónica saray 10-2
La electricidad y la electrónica saray 10-2La electricidad y la electrónica saray 10-2
La electricidad y la electrónica saray 10-2
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
 
JUANITA Y SEBASTIAN TRABAJO TEGNOLOGIA TABLA EXCEL
JUANITA Y SEBASTIAN TRABAJO TEGNOLOGIA TABLA EXCELJUANITA Y SEBASTIAN TRABAJO TEGNOLOGIA TABLA EXCEL
JUANITA Y SEBASTIAN TRABAJO TEGNOLOGIA TABLA EXCEL
 

Introducción a Symfony2

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