Taller introduccion symfony2

1,058 views

Published on

Taller breve de introducción a symfony2

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,058
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
46
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Taller introduccion symfony2

  1. 1. Introducción a Symfony2 Por: Mario J. Inga Cahuana @mario21ic
  2. 2. Agenda● ¿Qué és?● Características● Arquitectura MVC● Flujo de apps● Componentes● Bundle● Taller● Links● Preguntas
  3. 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. 4. Características● Alto rendimiento● Usabilidad avanzada● Extensible● Flexible● Contruido para desarrolladores● Construido en base a otros grandes frameworks● Listo para usar● OpenSource
  5. 5. Arquitectura Symfony2● MVC: Modelo, Vista y Controlador● Controlador: Symfony2● Modelo: Doctrine, ORM basado en Hibernate● Vista: Twig, basado en plantillas de Django
  6. 6. Flujo de apps Symfony2
  7. 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. 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. 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. 10. Taller● Objetivo: Realizar un pequeño CRUD con 2 modelos relacionados.● Requisitos: Linux, PHP 5.4, MySQL o PostgreSQL, Git
  11. 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. 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. 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. 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. 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. 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. 17. Taller – Estructura archivossrc/Blog/└── BlogBundle ├── BlogBundle.php ├── Controller │ └── DefaultController.php ├── DependencyInjection │ ├── BlogExtension.php │ └── Configuration.php └── Resources ├── config │ ├── routing.yml │ └── services.yml └── views └── Default └── index.html.twig
  18. 18. Taller - Enrutamiento● Editamos src/Blog/BlogBundle/Resources/config/rout ing.yml agregando: blog_lista: pattern: /blog defaults: { _controller: BlogBundle:Default:blog }
  19. 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. 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. 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. 22. Taller – Modelo - Blog /** @ORMColumn(type="string", length=100) */ protected $titulo; /** @ORMColumn(type="text", nullable=True) */ protected $contenido; /** * @ORMManyToOne(targetEntity="BlogBlogBundleEntityAutor") */ protected $autor; }
  23. 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. 24. Taller – Modelo - Autor● Agregar el método: public function __toString() { return $this->getNombre(); }
  25. 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. 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. 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. 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. 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. 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. 31. Taller - Nuevo - Controller● Editar src/Blog/BlogBundle/Controller/DefaultCon troller.php, agregar antes de class: use BlogBlogBundleFormBlogType;● Agregar este nuevo método:
  32. 32. Taller - Nuevo - Controllerpublic 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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/
  45. 45. ¿Preguntas?

×