SlideShare a Scribd company logo
1 of 83
Frameworks de desarrollo

Symfony
Clase 3

                       Javier Eguíluz
                       javier.eguiluz@gmail.com
Esta obra dispone de una licencia de tipo Creative
Commons Reconocimiento‐No comercial‐ Compartir 
             bajo la misma licencia 3.0 




 Se prohíbe explícitamente el uso de este material en 
        actividades de formación comerciales

http://creativecommons.org/licenses/by‐nc‐sa/3.0/es/
This work is licensed under a Creative Commons
  Attribution‐Noncommercial‐Share Alike 3.0 




    The use of these slides in commercial courses or
            trainings is explicitly prohibited

 http://creativecommons.org/licenses/by‐nc‐sa/3.0/es/
Capítulo 12

El generador de 
la parte de 
administración
Creando la aplicación 
     backend
backend/
                                 config/
$ symfony
                                 lib/
generate:app
‐‐escaping‐strategy=on
                                 modules/
‐‐csrf‐secret=UniqueSecret1
backend
                                 templates/
Controladores frontales

frontend_dev.php     frontend |  desarrollo

index.php            frontend |  producción

backend_dev.php      backend |  desarrollo

backend.php          backend |  producción
propel:data‐load


JobeetJob::save()   apps/frontend/config/app.yml




   app.yml


   backend/
                                config/app.yml
Los módulos de la 
aplicación backend
$ symfony propel:generate‐admin
backend JobeetJob ‐‐module=job

       backend/modules/job
          actions/
          config/
          lib/
          templates/
apps/backend/config/routing.yml

jobeet_job:
  class: sfPropelRouteCollection
  options:
    model:                JobeetJob
    module:               job
    prefix_path:          job
    column:               id
    with_wildcard_routes: true
El aspecto de la 
aplicación backend
http://jobeet.localhost/backend_dev.php/job

• Listado con paginación, 
ordenación y filtrado
• Crear, modificar y borrar 
objetos
• Borrar varios objetos a la 
vez
• Formularios con validación

• Mensajes flash para 
feedback
• ...y mucho más
La cache de Symfony
apps/backend/modules/job/actions/actions.class.php
require_once dirname(__FILE__).'/../lib/jobGeneratorConfiguration.class.php';
require_once dirname(__FILE__).'/../lib/jobGeneratorHelper.class.php';
class jobActions extends autoJobActions
{
}


                    cache/backend/dev/modules/autoJob/actions/actions.class.php

class autoJobActions extends sfActions
{
  public function preExecute()
  {
    $this‐>configuration = new jobGeneratorConfiguration();
    ...




           apps/backend/modules/job/config/generator.yml
apps/backend/modules/job/config/generator.yml
generator:
  class: sfPropelGenerator
  param:
    model_class:           JobeetJob
    theme:                 admin
    non_verbose_templates: true
    with_show:             false
    singular:              ~
    plural:                ~
    route_prefix:          jobeet_job
    with_propel_route:     1

    config:
      actions: ~
      fields:  ~
      list:    ~
      filter:  ~
      form:    ~
      edit:    ~
      new:     ~
Configuración del 
      título
apps/backend/modules/category/config/generator.yml
config:
  actions: ~
  fields:  ~
  list:    
    title: Gestión de categorías
  filter:  ~
  form:    ~
  edit:
    title: Editando la categoría quot;%%name%%quot;
  new:
    title: Nueva categoría
Configuración de los 
      campos
apps/backend/modules/job/config/generator.yml
config:
  fields:
    is_activated: { label: Activated?, help: Whether the user 
has activated the job, or not }
    is_public:    { label: Public? }




config:
  list:
    fields:
      is_public:    { label: quot;Public? (label for the list)quot; }
fields


filter                     list
            form


                     new
     edit
Configuración de la 
    página list
apps/backend/modules/category/config/generator.yml
config:
  list:
    title:   Category Management
    display: [=name, slug]
                  enlace
apps/backend/modules/job/config/generator.yml
config:
  list:
    title:   Job Management
    display: [company, position, location, url, is_activated, email]
    layout:  stacked
    params:  |           %%jobeet_category%%
     %%is_activated%% <small>%%category_id%%</small> ‐ %%company%%
     (<em>%%email%%</em>) is looking for a %%=position%% (%%location%%)
apps/backend/modules/job/config/generator.yml
config:
  list:
    sort: [expires_at, desc]
    max_per_page: 10
apps/backend/modules/category/config/generator.yml
config:
  list:
    batch_actions: {}
apps/backend/modules/job/config/generator.yml
config:
  list:
    batch_actions:
      _delete:    ~
      extend:     ~



               apps/backend/modules/job/actions/actions.class.php
class jobActions extends autoJobActions {
  public function executeBatchExtend(sfWebRequest $request) {
    $ids = $request‐>getParameter('ids');
    $jobs = JobeetJobPeer::retrieveByPks($ids);
    foreach ($jobs as $job) {
      $job‐>extend(true);
    }
    ...
  }
}
apps/backend/modules/category/config/generator.yml
config:
  list:
    object_actions: {}


                      apps/backend/modules/job/config/generator.yml
config:
  list:
    object_actions:
      extend:     ~
      _edit:      ~
      _delete:    ~
apps/backend/modules/job/config/generator.yml
config:
  list:
    actions:
      deleteNeverActivated: { label: Borrar ofertas inactivas }




                 apps/backend/modules/job/actions/actions.class.php
class jobActions extends autoJobActions {
  public function executeListDeleteNeverActivated(sfWebRequest   $request)
  {
      $nb = JobeetJobPeer::cleanup(60);
      ...
      $this‐>redirect('@jobeet_job');
  }
apps/backend/modules/job/config/generator.yml
config:
  list:
    peer_method: doSelectJoinJobeetCategory
Configuración de la 
    página de 
   formularios
apps/backend/modules/job/config/generator.yml
config:
  form:
    display:
      Content: [category_id, type, company,
                logo, url, position, location,
                description, how_to_apply, 
                is_public, email]
      Admin:   [_generated_token, is_activated, 
                expires_at]


     apps/backend/modules/job/templates/_generated_token.php

<div class=quot;sf_admin_form_rowquot;>
  <label>Token</label>
  <?php echo $form‐>getObject()‐>getToken() ?>
</div>
BaseJobeetJobForm


   JobeetJobForm


BackendJobeetJobForm
lib/form/BackendJobeetJobForm.php

$this‐>widgetSchema['logo'] = new sfWidgetFormInputFileEditable(array(
    'label'        => 'Company logo',
    'file_src'     => '/uploads/jobs/'.$this‐>getObject()‐>getLogo(),
     'is_image'    => true,
     'edit_mode'   => !$this‐>isNew(),
     'template'    => '<div>%file%<br />%input%<br />%delete% %delete_label%</div>', 
)); 
Configuración de los 
       filtros
$ ./symfony propel:build‐filters

 $ ./symfony propel:build‐all
$ ./symfony propel:build‐filters


                      JobeetCategoryFormFilter
JobeetJobFormFilter                              JobeetAffiliateFormFilter


                         lib/filter/
apps/backend/modules/category/config/generator.yml
config:
  filter:
    class: false


                   apps/backend/modules/job/config/generator.yml
filter:
  display: [category_id,
            company,
            position, 
            description,
            is_activated,
            is_public,
            email,
            expires_at]
Modificando las 
  acciones
executeIndex()         getFilters()
listexecuteFilter()    setFilters()
executeNew()           getPager()
executeCreate()        getPage()
executeEdit()          setPage()
executeUpdate()        buildCriteria()
executeDelete()        addSortCriteria()
executeBatch()         getSort()
executeBatchDelete()   setSort()
processForm()
Personalizando las 
    plantillas
_assets.php               _list_field_boolean.php
_filters.php              _list_footer.php
_filters_field.php        _list_header.php
_flashes.php              _list_td_actions.php
_form.php                 _list_td_batch_actions.php
_form_actions.php         _list_td_stacked.php
_form_field.php           _list_td_tabular.php
_form_fieldset.php        _list_th_stacked.php
_form_footer.php          _list_th_tabular.php
_form_header.php          _pagination.php
_list.php                 editSuccess.php
_list_actions.php         indexSuccess.php
_list_batch_actions.php   newSuccess.php
Capítulo 13

El usuario
sfUser
Mensajes flash
Mensaje temporal que se almacena en la sesión 
 del usuario y que se borra automáticamente 
       después de la siguiente petición
apps/frontend/modules/job/actions/actions.class.php

public function executeExtend(sfWebRequest $request)
{
    ...
    $this‐>getUser()‐>setFlash(
       'notice',
       'La oferta se ha actualizado'
    );
    ...
}
                              apps/frontend/templates/layout.php

<?php if ($sf_user‐>hasFlash('notice')): ?>
<div class=quot;flash_noticequot;>
  <?php echo $sf_user‐>getFlash('notice') ?>
</div>
<?php endif; ?>
Atributos del usuario
quot;para facilitar la navegación por las ofertas 
  de trabajo, en el menú se muestran los 
enlaces a las tres últimas ofertas de trabajo 
            vistas por el usuarioquot;
apps/frontend/modules/job/actions/actions.class.php
class jobActions extends sfActions
{
  public function executeShow(sfWebRequest $request)
  {
    $this‐>job = $this‐>getRoute()‐>getObject();

    // obtener las ofertas del historial
    $jobs = $this‐>getUser()‐>getAttribute(
       'historial',
        array()
    );

    // añadir la oferta al historial
    array_unshift($jobs, $this‐>job‐>getId());

     // guardar de nuevo el historial
     $this‐>getUser()‐>setAttribute('historial', $jobs);
    }
    // ...
}
apps/frontend/modules/job/actions/actions.class.php
class jobActions extends sfActions
{
  public function executeShow(sfWebRequest $request)
  {
    $this‐>job = $this‐>getRoute()‐>getObject();
    $this‐>getUser()‐>addJobToHistory($this‐>job);
  }

    // ...
}
                           apps/frontend/lib/myUser.class.php
             class myUser extends sfBasicSecurityUser
             {
               public function addJobToHistory(JobeetJob $job)
               {
                 ...
               }
                                   $sf_user
             }
La seguridad de la 
    aplicación
apps/backend/config/security.yml

default:
  is_secure: on
apps/backend/config/settings.yml
 all:
   .actions:
      login_module: default
      login_action: login



if (!$this‐>getUser()‐>isAuthenticated())
{
  $this‐>getUser()‐>setAuthenticated(true);
}
Plugins
http://www.symfony‐project.org/plugins
sfGuardPlugin
$ ./symfony plugin:install sfGuardPlugin




$ apt‐get install php‐pear
$ pear channel‐discover pear.symfony‐project.com
La seguridad de la 
aplicación backend
$ ./symfony propel:build‐all ‐‐no‐confirmation

$ ./symfony cc
                            apps/backend/lib/myUser.class.php
 class myUser extends sfGuardSecurityUser
 {
 }

                                 apps/backend/config/settings.yml
 all:
   .settings:
      enabled_modules: [default, sfGuardAuth]

    # ...
   .actions:
     login_module: sfGuardAuth
     login_action: signin
$ ./symfony guard:create‐user usuario contrasena

$ ./symfony guard:promote usuario
$ ./symfony list guard
apps/backend/templates/layout.php
<?php if ($sf_user‐>isAuthenticated()): ?>
<div id=quot;menuquot;>
  <ul>
    <li>
      <?php echo link_to('Jobs', '@jobeet_job') ?>
    </li>
    <li>
      <?php echo link_to('Categories', '@jobeet_category') ?>
    </li>
    <li>
      <?php echo link_to('Logout', '@sf_guard_signout') ?>
    </li> 
  </ul>
</div>
                                 $ ./symfony app:routes
<?php endif; ?> 
apps/backend/config/settings.yml
all:
  .settings:
     enabled_modules: [default, sfGuardAuth, sfGuardUser]



                               apps/backend/templates/layout.php
<li>
  <?php echo link_to('Users', '@sf_guard_user') ?>
</li>
Probando los 
  usuarios
test/functional/frontend/jobActionsTest.php
$browser‐>
  info('4 ‐ User job history')‐>

  loadData()‐>
  restart()‐>

  info(' 4.1 ‐ When the user access a job, it is added to its history')‐>
  get('/')‐>
  click('Web Developer', array(), array('position' => 1))‐>
  get('/')‐>
  with('user')‐>begin()‐>
      isAttribute('job_history', array($browser‐>getMostRecentProgrammingJob()‐>getId()))‐>
  end()‐>

     info(' 4.2 ‐ A job is not added twice in the history')‐>
     click('Web Developer', array(), array('position' => 1))‐>
     get('/')‐>
     with('user')‐>begin()‐>
      isAttribute('job_history', array($browser‐>getMostRecentProgrammingJob()‐>getId()))‐>
  end()
; 
Capítulo 14

El día de 
descanso
CC by‐nc‐sa StockVault
Capítulo 15

Canales Atom
Formatos
plantilla1




petición   plantilla2




           plantilla3
$request‐>setRequestFormat('xml');

         txt      xml
         js       rdf
         css      atom
         json
http://jobeet.localhost/frontend_dev.php/job



http://jobeet.localhost/frontend_dev.php/job.html
Canales Atom
apps/frontend/modules/job/templates/indexSuccess.atom.php

<?xml version=quot;1.0quot; encoding=quot;utf‐8quot;?>
<feed xmlns=quot;http://www.w3.org/2005/Atomquot;>
  <title>Jobeet</title>
  <subtitle>Latest Jobs</subtitle>
  <link href=quot;quot; rel=quot;selfquot;/>
  <link href=quot;quot;/>
  <updated></updated>
  <author><name>Jobeet</name></author>
  <id>Unique Id</id>

<entry>
  <title>Job title</title>
  <link href=quot;quot; />
  <id>Unique id</id>
  <updated></updated>
  <summary>Job description</summary>
  <author><name>Company</name></author>
</entry>
</feed>
indexSuccess.php
          indexSuccess.html.php

                         indexSuccess.php
return sfView::SUCCESS
                         indexError.php
return sfView::ERROR
                         indexHola.php
return quot;Holaquot;
                         indexPlantilla.php
return quot;Plantillaquot;
apps/frontend/templates/layout.php


<li class=quot;feedquot;>
  <a href=quot;<?php echo url_for('@job?sf_format=atom') ?>quot;>
    Full feed
  </a>
</li>
                       application/atom+xml; charset=utf‐8
                       has_layout: off


<link
  rel=quot;alternatequot;
  type=quot;application/atom+xmlquot;
  title=quot;Latest Jobsquot;
  href=quot;<?php echo url_for('@job?sf_format=atom', true) ?>quot; 
/>
apps/frontend/modules/job/templates/indexSuccess.atom.php

<title>Jobeet</title>
<subtitle>Latest Jobs</subtitle>
<link href=quot;<?php echo url_for('@job?sf_format=atom', true) ?>quot;
rel=quot;selfquot;/>
<link href=quot;<?php echo url_for('@homepage', true) ?>quot;/>
<updated><?php echo gmstrftime('%Y‐%m‐%dT%H:%M:%SZ', 
JobeetJobPeer::getLatestPost()‐>getCreatedAt('U')) ?></updated>
<author>
  <name>Jobeet</name>
</author>
<id><?php echo sha1(url_for('@job?sf_format=atom', true)) ?></id>
apps/frontend/modules/job/templates/indexSuccess.atom.php

<?php use_helper('Text') ?>
<?php foreach ($categories as $category): ?>
<?php foreach ($category‐>getActiveJobs(
                                                              as $job): ?>
                 sfConfig::get('app_max_jobs_on_homepage'))

<entry>
  <title>
      <?php echo $job‐>getPosition() ?>
      (<?php echo $job‐>getLocation() ?>)
  </title>
  <link href=quot;<?php echo url_for('job_show_user', $job, true) ?>quot; />
  <id><?php echo sha1($job‐>getId()) ?></id>
...
apps/frontend/config/routing.yml
category:
  url:     /category/:slug.:sf_format
  class:   sfPropelRoute
  param:   { module: category, action: show, sf_format: html }
  options: { model: JobeetCategory, type: object }
  requirements:
    sf_format: (?:html|atom)


            apps/frontend/modules/job/templates/indexSuccess.php
<div class=quot;feedquot;>
  <a href=quot;<?php echo url_for('category', array('sf_subject' 
=> $category, 'sf_format' => 'atom')) ?>quot;>Feed</a>
</div> 
             apps/frontend/modules/job/templates/showSuccess.php
<div class=quot;feedquot;>
  <a href=quot;<?php echo url_for('category', array('sf_subject' 
=> $category, 'sf_format' => 'atom')) ?>quot;>Feed</a>
</div> 
apps/frontend/modules/job/templates/_list.atom.php
<?php use_helper('Text') ?>
<?php foreach ($jobs as $job): ?>
  <entry>
    <title><?php echo $job‐>getPosition() ?> (<?php echo $job‐
>getLocation() ?>)</title>
    <link href=quot;<?php echo url_for('job_show_user', $job, 
true) ?>quot; />
    <id><?php echo sha1($job‐>getId()) ?></id>
    ...

      apps/frontend/modules/job/templates/indexSuccess.atom.php
<?php foreach ($categories as $category): ?>
<?php
include_partial(
  'job/list',
   array('jobs' => $category‐>getActiveJobs(sfConfig::get('app_max_jobs_on_homepage'))
))
?>
<?php endforeach; ?>

More Related Content

What's hot

What's New in newforms-admin
What's New in newforms-adminWhat's New in newforms-admin
What's New in newforms-adminbrosner
 
Rails MVC by Sergiy Koshovyi
Rails MVC by Sergiy KoshovyiRails MVC by Sergiy Koshovyi
Rails MVC by Sergiy KoshovyiPivorak MeetUp
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011Arun Gupta
 
7 reasons why developers should love Joomla!
7 reasons why developers should love Joomla!7 reasons why developers should love Joomla!
7 reasons why developers should love Joomla!Bartłomiej Krztuk
 
How to Create A Magento Adminhtml Controller in Magento Extension
How to Create A Magento Adminhtml Controller in Magento ExtensionHow to Create A Magento Adminhtml Controller in Magento Extension
How to Create A Magento Adminhtml Controller in Magento ExtensionHendy Irawan
 
How to create a magento controller in magento extension
How to create a magento controller in magento extensionHow to create a magento controller in magento extension
How to create a magento controller in magento extensionHendy Irawan
 
Mason - A Template system for us Perl programmers
Mason - A Template system for us Perl programmersMason - A Template system for us Perl programmers
Mason - A Template system for us Perl programmersJerome Eteve
 
Jinja2 Templates - San Francisco Flask Meetup
Jinja2 Templates - San Francisco Flask MeetupJinja2 Templates - San Francisco Flask Meetup
Jinja2 Templates - San Francisco Flask MeetupAlan Hamlett
 
Getting started with Rails (2), Season 2
Getting started with Rails (2), Season 2Getting started with Rails (2), Season 2
Getting started with Rails (2), Season 2RORLAB
 
e computer notes - Advanced subqueries
e computer notes - Advanced subqueriese computer notes - Advanced subqueries
e computer notes - Advanced subqueriesecomputernotes
 
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編Masakuni Kato
 
Rugalytics | Ruby Manor Nov 2008
Rugalytics | Ruby Manor Nov 2008Rugalytics | Ruby Manor Nov 2008
Rugalytics | Ruby Manor Nov 2008Rob
 
Apostrophe (improved Paris edition)
Apostrophe (improved Paris edition)Apostrophe (improved Paris edition)
Apostrophe (improved Paris edition)tompunk
 
Introduction to Zend framework
Introduction to Zend framework Introduction to Zend framework
Introduction to Zend framework Matteo Magni
 
Top Wordpress dashboard hacks
Top Wordpress dashboard hacks Top Wordpress dashboard hacks
Top Wordpress dashboard hacks Pankaj Subedi
 
Oracle APEX Performance
Oracle APEX PerformanceOracle APEX Performance
Oracle APEX PerformanceScott Wesley
 
Working with Javascript in Rails
Working with Javascript in RailsWorking with Javascript in Rails
Working with Javascript in RailsSeungkyun Nam
 

What's hot (20)

Jsf
JsfJsf
Jsf
 
What's New in newforms-admin
What's New in newforms-adminWhat's New in newforms-admin
What's New in newforms-admin
 
Rails MVC by Sergiy Koshovyi
Rails MVC by Sergiy KoshovyiRails MVC by Sergiy Koshovyi
Rails MVC by Sergiy Koshovyi
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011
 
7 reasons why developers should love Joomla!
7 reasons why developers should love Joomla!7 reasons why developers should love Joomla!
7 reasons why developers should love Joomla!
 
How to Create A Magento Adminhtml Controller in Magento Extension
How to Create A Magento Adminhtml Controller in Magento ExtensionHow to Create A Magento Adminhtml Controller in Magento Extension
How to Create A Magento Adminhtml Controller in Magento Extension
 
How to create a magento controller in magento extension
How to create a magento controller in magento extensionHow to create a magento controller in magento extension
How to create a magento controller in magento extension
 
Mason - A Template system for us Perl programmers
Mason - A Template system for us Perl programmersMason - A Template system for us Perl programmers
Mason - A Template system for us Perl programmers
 
Jinja2 Templates - San Francisco Flask Meetup
Jinja2 Templates - San Francisco Flask MeetupJinja2 Templates - San Francisco Flask Meetup
Jinja2 Templates - San Francisco Flask Meetup
 
Getting started with Rails (2), Season 2
Getting started with Rails (2), Season 2Getting started with Rails (2), Season 2
Getting started with Rails (2), Season 2
 
e computer notes - Advanced subqueries
e computer notes - Advanced subqueriese computer notes - Advanced subqueries
e computer notes - Advanced subqueries
 
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
 
DRUPAL Menu System
DRUPAL Menu SystemDRUPAL Menu System
DRUPAL Menu System
 
Rugalytics | Ruby Manor Nov 2008
Rugalytics | Ruby Manor Nov 2008Rugalytics | Ruby Manor Nov 2008
Rugalytics | Ruby Manor Nov 2008
 
Apostrophe (improved Paris edition)
Apostrophe (improved Paris edition)Apostrophe (improved Paris edition)
Apostrophe (improved Paris edition)
 
Introduction to Zend framework
Introduction to Zend framework Introduction to Zend framework
Introduction to Zend framework
 
Top Wordpress dashboard hacks
Top Wordpress dashboard hacks Top Wordpress dashboard hacks
Top Wordpress dashboard hacks
 
Jsp Notes
Jsp NotesJsp Notes
Jsp Notes
 
Oracle APEX Performance
Oracle APEX PerformanceOracle APEX Performance
Oracle APEX Performance
 
Working with Javascript in Rails
Working with Javascript in RailsWorking with Javascript in Rails
Working with Javascript in Rails
 

Similar to Curso Symfony - Clase 3

Using Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkUsing Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkDirk Haun
 
Empowering users: modifying the admin experience
Empowering users: modifying the admin experienceEmpowering users: modifying the admin experience
Empowering users: modifying the admin experienceBeth Soderberg
 
Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Compare Infobase Limited
 
07 Php Mysql Update Delete
07 Php Mysql Update Delete07 Php Mysql Update Delete
07 Php Mysql Update DeleteGeshan Manandhar
 
Desymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus BundlesDesymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus BundlesAlbert Jessurum
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowVrann Tulika
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialYi-Ting Cheng
 
Intro To Mvc Development In Php
Intro To Mvc Development In PhpIntro To Mvc Development In Php
Intro To Mvc Development In Phpfunkatron
 
Best Practices in Plugin Development (WordCamp Seattle)
Best Practices in Plugin Development (WordCamp Seattle)Best Practices in Plugin Development (WordCamp Seattle)
Best Practices in Plugin Development (WordCamp Seattle)andrewnacin
 
The Google App Engine Oil Framework
The Google App Engine Oil FrameworkThe Google App Engine Oil Framework
The Google App Engine Oil FrameworkEric ShangKuan
 
WordPress Structure and Best Practices
WordPress Structure and Best PracticesWordPress Structure and Best Practices
WordPress Structure and Best Practicesmarkparolisi
 
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)arcware
 
First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentNuvole
 
Using and reusing CakePHP plugins
Using and reusing CakePHP pluginsUsing and reusing CakePHP plugins
Using and reusing CakePHP pluginsPierre MARTIN
 
WordPress as a Content Management System
WordPress as a Content Management SystemWordPress as a Content Management System
WordPress as a Content Management SystemValent Mustamin
 
DJango admin interface
DJango admin interfaceDJango admin interface
DJango admin interfaceMahesh Shitole
 

Similar to Curso Symfony - Clase 3 (20)

Using Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkUsing Geeklog as a Web Application Framework
Using Geeklog as a Web Application Framework
 
The Rails Way
The Rails WayThe Rails Way
The Rails Way
 
Empowering users: modifying the admin experience
Empowering users: modifying the admin experienceEmpowering users: modifying the admin experience
Empowering users: modifying the admin experience
 
Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation
 
07 Php Mysql Update Delete
07 Php Mysql Update Delete07 Php Mysql Update Delete
07 Php Mysql Update Delete
 
Gae
GaeGae
Gae
 
Desymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus BundlesDesymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus Bundles
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request Flow
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails Turtorial
 
Intro To Mvc Development In Php
Intro To Mvc Development In PhpIntro To Mvc Development In Php
Intro To Mvc Development In Php
 
Best Practices in Plugin Development (WordCamp Seattle)
Best Practices in Plugin Development (WordCamp Seattle)Best Practices in Plugin Development (WordCamp Seattle)
Best Practices in Plugin Development (WordCamp Seattle)
 
The Google App Engine Oil Framework
The Google App Engine Oil FrameworkThe Google App Engine Oil Framework
The Google App Engine Oil Framework
 
WordPress Structure and Best Practices
WordPress Structure and Best PracticesWordPress Structure and Best Practices
WordPress Structure and Best Practices
 
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
 
Yii Introduction
Yii IntroductionYii Introduction
Yii Introduction
 
First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven Development
 
Redmine Betabeers SVQ
Redmine Betabeers SVQRedmine Betabeers SVQ
Redmine Betabeers SVQ
 
Using and reusing CakePHP plugins
Using and reusing CakePHP pluginsUsing and reusing CakePHP plugins
Using and reusing CakePHP plugins
 
WordPress as a Content Management System
WordPress as a Content Management SystemWordPress as a Content Management System
WordPress as a Content Management System
 
DJango admin interface
DJango admin interfaceDJango admin interface
DJango admin interface
 

More from Javier Eguiluz

deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de SymfonydeSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de SymfonyJavier Eguiluz
 
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)Javier Eguiluz
 
Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)Javier Eguiluz
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricksJavier Eguiluz
 
Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Javier Eguiluz
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPJavier Eguiluz
 
Twig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasTwig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasJavier Eguiluz
 
Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Javier Eguiluz
 
Desymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseñoDesymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseñoJavier Eguiluz
 
Desymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendDesymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendJavier Eguiluz
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosJavier Eguiluz
 
Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2Javier Eguiluz
 
Symfony2, Jornadas Symfony
Symfony2, Jornadas SymfonySymfony2, Jornadas Symfony
Symfony2, Jornadas SymfonyJavier Eguiluz
 
Curso Symfony - Anexos
Curso Symfony - AnexosCurso Symfony - Anexos
Curso Symfony - AnexosJavier Eguiluz
 
Curso Symfony - Clase 5
Curso Symfony - Clase 5Curso Symfony - Clase 5
Curso Symfony - Clase 5Javier Eguiluz
 

More from Javier Eguiluz (20)

deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de SymfonydeSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
 
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
 
Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
 
Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8
 
Silex al límite
Silex al límiteSilex al límite
Silex al límite
 
Twig tips and tricks
Twig tips and tricksTwig tips and tricks
Twig tips and tricks
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHP
 
Twig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasTwig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadas
 
Wallpaper Notifier
Wallpaper NotifierWallpaper Notifier
Wallpaper Notifier
 
Backend (sf2Vigo)
Backend (sf2Vigo)Backend (sf2Vigo)
Backend (sf2Vigo)
 
Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)
 
Desymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseñoDesymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseño
 
Desymfony 2011 - Twig
Desymfony 2011 - TwigDesymfony 2011 - Twig
Desymfony 2011 - Twig
 
Desymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendDesymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: Backend
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2
 
Symfony2, Jornadas Symfony
Symfony2, Jornadas SymfonySymfony2, Jornadas Symfony
Symfony2, Jornadas Symfony
 
Curso Symfony - Anexos
Curso Symfony - AnexosCurso Symfony - Anexos
Curso Symfony - Anexos
 
Curso Symfony - Clase 5
Curso Symfony - Clase 5Curso Symfony - Clase 5
Curso Symfony - Clase 5
 

Recently uploaded

Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
Bluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfBluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfngoud9212
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 

Recently uploaded (20)

E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
Bluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfBluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdf
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 

Curso Symfony - Clase 3