<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Berriart &#187; Symfony</title>
	<atom:link href="http://www.berriart.com/category/symfony/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.berriart.com</link>
	<description>Un programador hablando de diseño............</description>
	<lastBuildDate>Sun, 05 Feb 2012 10:52:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Bundle para crear sitemap en Symfony2</title>
		<link>http://www.berriart.com/2012/02/05/bundle-para-crear-sitemap-en-symfony2/</link>
		<comments>http://www.berriart.com/2012/02/05/bundle-para-crear-sitemap-en-symfony2/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 10:52:46 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[bundle]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sitemap]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=922</guid>
		<description><![CDATA[Creo que se puede decir que ya está lista la primera versión de mi primer Bundle público de Symfony2, se trata de BerriartSitemapBundle. Tal y como se indica en el nombre se trata de un bundle para crear sitemaps en tu proyecto Symfony2. La verdad es que me he basado en uno existente para crearlo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.berriart.com/wp-content/uploads/2012/02/google_sitemap_symfony.png"><img src="http://www.berriart.com/wp-content/uploads/2012/02/google_sitemap_symfony.png" alt="Imagen de BerriartSitemapBundle" title="google_sitemap_symfony" width="180" height="180" class="alignleft size-full wp-image-926" /></a>Creo que se puede decir que ya está lista la primera versión de mi primer Bundle público de Symfony2, se trata de <a href="http://www.berriart.com/en/berriart-sitemap-bundle-symfony2/">BerriartSitemapBundle</a>. Tal y como se indica en el nombre se trata de un <em>bundle</em> para crear sitemaps en tu proyecto Symfony2.</p>
<p>La verdad es que me he basado en uno existente para crearlo (<a rel="nofollow" href="https://github.com/avalanche123/AvalancheSitemapBundle">AvalancheSitemapBundle</a>), y la mayor diferencia entre ambos es que el de Avalanche123 está preparado para usarse con DoctrineMongoDB y el mio con Doctrine, por lo que los datos del sitemap se podrían almacenar en una BD MySQL.</p>
<p>La verdad es que no veía la necesidad de instalar mongodb exclusivamente para almacenar las URLs del sitemap y como no me parece descabellado usar la misma BD del proyecto para hacerlo, decidí que yo quería algo parecido a ese Bundle pero con MySQL, así que lo hice y aquí está.</p>
<p>Solo lo he probado en un proyecto y es una primera versión, así que puede que tenga algún que otro fallo, si los encontráis no dudéis en decírmelo (a través del <a href="https://github.com/artberri/BerriartSitemapBundle/issues">Issue Tracker de Github</a> por favor).</p>
<p>El siguiente paso en el desarrollo del bundle será añadirle la posibilidad de generar físicamente los ficheros del sitemap en disco y comprimirlos con gzip, para que no tenga que generar al vuelo el sitemap cada vez que hay una petición. Si además de esta se os ocurre alguna otra funcionalidad que os gustaría que le añadiera, ya sabéis, me lo contáis y lo valoro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2012/02/05/bundle-para-crear-sitemap-en-symfony2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony2, permisos en el directorio cache (y en logs)</title>
		<link>http://www.berriart.com/2012/01/09/symfony2-permisos-directorio-cache/</link>
		<comments>http://www.berriart.com/2012/01/09/symfony2-permisos-directorio-cache/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 09:33:25 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[consola]]></category>
		<category><![CDATA[permisos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=856</guid>
		<description><![CDATA[Supongo que habréis sido más espabilados que yo, pero si alguno de vosotros también se ha peleado con los permisos del directorio app/cache, aquí tenéis la solución. Mi problema era que en la instalación de Symfony2 siempre le daba permisos 777 a los directorios app/cache y app/logs, pensaba que con eso valía. En un principio [...]]]></description>
			<content:encoded><![CDATA[<p>Supongo que habréis sido más espabilados que yo, pero si alguno de vosotros también se ha peleado con los permisos del directorio <code>app/cache</code>, aquí tenéis la solución. Mi problema era que en la instalación de <a href="http://www.berriart.com/2011/07/11/primeras-impresiones-symfony2/">Symfony2</a> siempre le daba permisos 777 a los directorios <code>app/cache</code> y <code>app/logs</code>, pensaba que con eso valía. </p>
<p>En un principio parece que sí, se accede vía web y sin ningún problema se van generando los ficheros de caché. Pero si más adelante ibas a la línea de comandos e intentabas alguna acción que tuviera que reescribir esos ficheros (generados por usuario apache o similar) te decía que el usuario que usabas no tenía permisos. Pues nada, yo volvía a darle permisos 777 con ayuda del <em>sudo</em>, hacía lo que tenía que hacer y de nuevo volvía a darle permisos para que el usuario <em>apache</em> no tuviera problemas en sobreescribir lo que yo había generado desde consola con mi usuario. Menudo lío ¿no?</p>
<p>Llegado un punto en el que este <em>loop</em> empezaba a convertirse en infinito, busqué un poquito y descubrí que no tenía que ir muy lejos a buscar la solución, estaba escrita en la <a href="http://symfony.com/doc/2.0/book/installation.html#configuration-and-setup">propia documentación de Symfony2</a>. Y realmente tampoco era tan complicada si hubiera pensado un poquito, ambos usuarios deben tener permisos sobre esos directorios:</p>
<pre>sudo rm -rf app/cache/*
sudo rm -rf app/logs/*
sudo setfacl -R -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs
sudo setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs</pre>
<p>Dónde <code>www-data</code> es el nombre del usuario de los accesos web (en algunos casos es <em>apache</em>, <em>http</em>,&#8230;) y dónde <code>whoami</code> es el nombre del usuario con el que accedes y ejecutas la consola de Symfony.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2012/01/09/symfony2-permisos-directorio-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como loguear un usuario en Symfony2</title>
		<link>http://www.berriart.com/2011/12/28/login-usuario-symonfy2-programacion/</link>
		<comments>http://www.berriart.com/2011/12/28/login-usuario-symonfy2-programacion/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 08:43:01 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[autenticación]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=848</guid>
		<description><![CDATA[Hace un tiempo Jon nos explicaba como desloguear un usuario mediante programación en Symfony2, hoy yo os cuento lo contrario, como loguear al usuario manualmente. La necesidad me surgió al implementar el login con Facebook y con Twitter en una aplicación y como puede resultar útil en otras ocasiones me lo apunto aquí. // src/Acme/HelloBundle/Controller/HelloController.php [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo Jon nos explicaba como <a href="http://jonsegador.com/2011/10/desloguear-a-un-usuario-mediante-programacion-en-symfony2/">desloguear un usuario mediante programación en Symfony2</a>, hoy yo os cuento lo contrario, como loguear al usuario manualmente. La necesidad me surgió al implementar el login con Facebook y con Twitter en una aplicación y como puede resultar útil en otras ocasiones me lo apunto aquí.</p>
<pre name="code" class="php">
// src/Acme/HelloBundle/Controller/HelloController.php

namespace Acme\HelloBundle\Controller;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

// ...

class HelloController
{
    public function barAction($foo)
    {
        // ...

        // Tienes que crear la entidad del usuario que quieres loguear, por ejemplo
        $em = $this->getDoctrine()->getEntityManager();
        $user = $em->getRepository('AcmeHelloBundle:User')->find($userId);

        // Si usas FOSUserBundle puedes sacar así el $providerKey
        $providerKey = $this->container->getParameter('fos_user.firewall_name');
        // Si no, puedes simplemente poner el nombre del firewall de tu aplicación
        $providerKey = 'main';

        // Si usas FOSUserBundle y has creado la entidad puedes sacar así los roles del user
        $roles = $user->getRoles();
        // Si no puedes hacerlo manualmente
        $roles = array('ROLE_USER');

        // Finalmente logueamos al usuario
        $token = new UsernamePasswordToken($user, null, $providerKey, $roles);
        $this->container->get('security.context')->setToken($token);

        // Y si lo crees necesario le rediriges con un mensajito
        $this->get("session")->setFlash('info', $this->get('translator')->trans('flash.logged_successfully'));

        return $this->redirect($this->generateUrl('homepage'));

        // ...
    }
}
</pre>
<p>Creo que no es mucho y que es sufientemente claro como para entenderlo sin más explicación que los comentarios del propio código, así que ahí queda. Si aún así os surge alguna dudilla que os pueda resolver hacedla en los comentarios, y con un poco de suerte y tiempo os contesto.</p>
<p>PD: Esta es mi inocentada, que creais que voy a retomar el blog como propósito de 2012 :p<br />
PD2: Hoy estoy que lo doy todo, he programado otro post para la semana que viene.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/12/28/login-usuario-symonfy2-programacion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Primeras impresiones con Symfony2</title>
		<link>http://www.berriart.com/2011/07/11/primeras-impresiones-symfony2/</link>
		<comments>http://www.berriart.com/2011/07/11/primeras-impresiones-symfony2/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 07:53:27 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Enlaces]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=824</guid>
		<description><![CDATA[Después de varias semanas trabajando con Symfony2 creo que va siendo hora de empezar a hablar un poco sobre el tema y compartir impresiones. He estado dos años trabajando con las versiones 1 de Symfony y ahora me he visto &#8216;obligado&#8217; a plantearme un cambio porque Symfony 1 digamos que&#8230; muere. El cambio de versiones [...]]]></description>
			<content:encoded><![CDATA[<p>Después de varias semanas trabajando con <a href="http://symfony.com/">Symfony2</a> creo que va siendo hora de empezar a hablar un poco sobre el tema y compartir impresiones. He estado dos años trabajando con las versiones 1 de Symfony y ahora me he visto &#8216;obligado&#8217; a plantearme un cambio porque Symfony 1 digamos que&#8230; muere. El cambio de versiones del framework ha sido brutal y sin ningún tipo de retrocompatibilidad, un cambio a mejor sí, pero dejándonos un poco en bragas a los desarrolladores.</p>
<p>Teniendo esto en cuenta me tengo que plantear un cambio, lo que tengo clarísimo es que con Symfony 1 no puedo seguir y como entiendo que el cambio más natural en un principio es Symfony2 he empezado con ello. No quiero decir que no me vaya a plantear otras posibilidades, por supuesto que sí, pero creo que es un buen punto para empezar, así que con ello estoy. Este cambio de framework va a necesitar en mi caso un esfuerzo extra porque a la vez me planteo el cambio casi seguro de <a href="http://www.propelorm.org/">Propel</a> a <a href="http://www.doctrine-project.org/">Doctrine2</a> y de <a href="http://www.berriart.com/2011/06/08/cambiando-de-svn-a-git/">SVN a Git</a>.</p>
<p>Creo que puedo resumir estas semanas en puntos que creo positivos y los que veo negativos:</p>
<ul>
<li><span style="color: #008000;">↑</span> <strong>Estructura y flexibilidad</strong>. Me gusta mucho como viene estructurado, y el hecho de que incluso el <em>core</em> del framework sea considerado como cualquier otra librería externa de tu aplicación y a su vez esté separado en librerías independientes que puedes usar fuera de Symfony. Además, todo (y todo es todo) es personalizable en Symfony2 (a los <em>plugins/widgets/módulos</em> que permiten modificarlo ahora les llaman <em>bundles</em>), aunque por el momento muchas veces lo difícil es saber cómo.</li>
<li><span style="color: #008000;">↑</span> <strong>Modelo-Vista-Controlador</strong>. Ya en la versión 1 la separación era muy clara, pero creo que con Symfony2 y Doctrine esto se ha visto reforzada y me gusta. Otro punto a favor creo que es el nuevo sistema de plantillas que se propone con Symfony2 llamado <a href="http://www.twig-project.org/">Twig</a>, que os recordará mucho a Smarty si alguna vez trabajásteis con él.</li>
<li><span style="color: #008000;">↑</span> <strong>Formularios</strong>. Creo que el nuevo sistema de formularios es más sencillo (uso) y a la vez más completo que el anterior. Uniéndolo con el ya mencionado sistema de plantillas Twig una bomba.</li>
<li><span style="color: #008000;">↑</span> <strong>¿Rendimiento?</strong> Lo pongo con interrogantes porque la verdad es que aunque he oído maravillas aún no he tenido la posibilidad de probarlo en producción y no voy a asegurar lo que no he visto (¡un excéptico de pura cepa como yo!), pero la verdad es que visto lo visto creo que puede ser bastante cierto.</li>
</ul>
<ul>
<li><span style="color: #ff0000;">↓</span> <strong>Documentación</strong>. Sé que aún no ha salido la versión final estable, sé que es un framework que &#8216;acaba de empezar&#8217;, sé que cuesta mucho documentar totalmente un proyecto de esta envergadura, pero me fastidia un montón estar convencidísimo de que algo se puede hacer y no encontrar como hacerlo. Estoy seguro de que con el tiempo esto cambiará, pero por el momento creo que es un gran problema sobre todo si eliges un framework de este tipo para agilizar tus desarrollos.</li>
<li><span style="color: #ff0000;">↓</span> <strong>Requisitos y gigantismo</strong>. Creo que Symfony2 no es un framework para cualquiera, no lo veo como solución a proyectos pequeños, webs informativas de pymes o blogs por ejemplo. Además para su correcto funcionamiento en producción son necesarios ciertos requisitos que no puedes encontrar en todos los hostings, sobre todo si tienes algo compartido. Para empezar PHP 5.3 es totalmente necesario, entre otras cosas por el obligatorio <a href="http://www.berriart.com/2011/02/15/como-usar-los-namespaces-en-php-5-3/">uso de los namespaces</a>. De todos modos los creadores de Symfony2 ya lo han tenido en cuenta y han creado <a href="http://silex-project.org/">Silex</a> un microframework basado en Symfony para proyectos más pequeños que estoy deseando probar.</li>
<li><span style="color: #ff0000;">↓</span> <strong>Autogeneradores</strong>. Cuando no has probado el chocolate no sabes si te gusta, pero como te guste luego no puedes dejar de comerlo, y si no tienes pues lo hechas en falta. Esto es lo que me ha pasado con los administradores autogenerados de Symfony 1 que tanto trabajo me han ahorrado, y ahora que Symfony2 no los trae pues me parece una gran falta. El generador de <abbr title="Create, Read, Update and Delete">CRUD</abbr> con Doctrine2 puede ser un sustitutivo en parte, pero no es lo mismo.</li>
</ul>
<p>Creo que esas pueden ser las conclusiones más importantes que he sacado estos primeros días. En una visión general y teniendo en cuenta que en Symfony2 aún quedan muchas cosas por hacer, creo voy a decir que en principio me gusta. Si os interesa el tema os dejo unos enlaces sobre el tema:</p>
<ul>
<li><a href="http://symfony.com">Symfony2</a>. Página oficial del framework.</li>
<li><a href="http://www.symfony.es/">symfony.es</a>. Página y comunidad de Symfony en español creada por <a href="http://javiereguiluz.com/">Javier Eguiluz</a>, alguien a quien merece la pena escuchar con atención.</li>
<li><a href="http://www.symfony.es/2011/07/06/desymfony-2011-todos-los-videos-y-presentaciones/">Ponencias de deSymfony2011</a>. Vídeos y presentaciones de las jornadas <a href="http://desymfony.com/">deSymfony</a> de este año. Aún no están colgados, pero está previsto que se vayan poniendo durante esta semana.</li>
<li><a href="http://fabien.potencier.org/">Fabien Potencier</a>. Creador del framework.</li>
<li>Gente que sabe de esto: <a href="http://javiereguiluz.com/">Javier Eguiluz</a>, <a href="http://asiermarques.com/">Asier Marqués</a>, <a href="http://sftuts.com/">Albert Jessurum</a>, <a href="http://nacho-martin.com/">Nacho Martín</a>, <a href="http://jonsegador.com/">Jon Segador</a> </li>
</ul>
<p>Sea o no mi decisión final quedarme con Symfony2 como alternativa a Symfony1 en los proyectos que ya he desarrollado, o los que vengan más adelante, estoy seguro de que no dejaré de investigar y probar cosas con él, así que seguro que seguiréis leyendo más cosas en Berriart referentes a este framework y ya sobre temas o usos más concretos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/07/11/primeras-impresiones-symfony2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Integrar Zend Framework en Symfony</title>
		<link>http://www.berriart.com/2011/04/12/integrar-zend-framework-symfony/</link>
		<comments>http://www.berriart.com/2011/04/12/integrar-zend-framework-symfony/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 08:26:53 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[integración]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=703</guid>
		<description><![CDATA[No, no me he vuelto loco, y os aseguro que no es nada tan raro. Es algo que Fabien Potencier creador de Symfony o Matthew Weier O’Phinney y Stefan Koopmanschap responsables del Framework Zend han sugerido en varias ocasiones. Los que usamos Symfony no tenemos porque volvernos locos para usar Lucene, la API de Google [...]]]></description>
			<content:encoded><![CDATA[<p>No, no me he vuelto loco, y os aseguro que no es nada tan raro. Es algo que <a href="http://fabien.potencier.org/">Fabien Potencier</a> creador de Symfony o <a href="http://weierophinney.net/matthew/">Matthew Weier O’Phinney</a> y <a href="http://www.stefankoopmanschap.com">Stefan Koopmanschap</a> responsables del Framework Zend han sugerido en varias ocasiones.</p>
<p>Los que usamos Symfony no tenemos porque volvernos locos para usar Lucene, la API de Google GData, manejar PDFs, recoger feeds o tantas otras funcionalidades que cubre tan bien el Framework Zend. No, porque integrar Zend en Symfony viene a ser bastante sencillo:</p>
<h3>Añadir la librería Zend a nuestro código</h3>
<p>Debemos descargar el <a href="http://framework.zend.com/download/current/">Framework Zend</a> y copiarlo en <em>lib/vendor</em>, que es el directorio donde guardamos habitualmente las librerías externas. Ahí lo meteremos todo dentro de una carpeta nueva que llamaremos Zend.</p>
<h3>Sistema para cargar Zend cuando lo necesitemos</h3>
<p>Para esto lo que vamos a hacer es crear un método nuevo en la clase <em>config/ProjectConfiguration.class.php</em> que nos permita cargar Zend fácilemente desde cualquier parte:</p>
<pre name="code" class="php">
class ProjectConfiguration extends sfApplicationConfiguration

  static protected $zendAutoloader = false;

  /** ............ **/

  /**
   * Agrega el framework Zend a nuestra App
   */
  static public function registerZend()
  {
    if(!self::$zendAutoloader)
    {
      set_include_path(implode(
        PATH_SEPARATOR,
        array(sfConfig::get('sf_lib_dir') . '/vendor', get_include_path())
      ));
      require_once 'Zend/Loader/Autoloader.php';
      self::$zendAutoloader = Zend_Loader_Autoloader::getInstance();
    }

    return self::$zendAutoloader;
  }
}
</pre>
<h3>Empezamos a usarlo</h3>
<p>Una vez hecho todo esto podríamos tranquilamente en un <em>action</em> o en algún <em>task</em> hacer uso del framework Zend. Por ejemplo&#8230;</p>
<pre name="code" class="php">
// Cargamos el framework Zend
ProjectConfiguration::registerZend();

// Utilizamos Zend....
try {
  $feed = Zend_Feed_Reader::import($parameters['feed']);
} catch (Zend_Feed_Exception $e) {
  /** ........ **/
}
</pre>
<p>Como podéis ver eso es todo <img src='http://www.berriart.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  A continuación os pongo las diapos que pasó la gente de Symfony y Zend en las conferencias explicando la utilidad de integrarlos y donde explican como hacerlo que es de donde he sacado yo la info:</p>
<ul>
<li><a href="http://fabien.potencier.org/talk/27/symfony-and-zend-framework-together-2009">Using Zend Framework and Symfony Together (Zend PHP Conference 2009)</a></li>
<li><a href="http://www.slideshare.net/weierophinney/using-zend-framework-with-symfony">Using Zend Framework with Symfony (sfLive 2010)</a></li>
<li><a href="http://www.slideshare.net/skoop/integrating-symfony-and">Integrating symfony and Zend Framework (IPC 2010)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/04/12/integrar-zend-framework-symfony/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cambiar separador de routing en Symfony</title>
		<link>http://www.berriart.com/2010/07/30/cambiar-separador-de-routing-en-symfony/</link>
		<comments>http://www.berriart.com/2010/07/30/cambiar-separador-de-routing-en-symfony/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 22:54:37 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[routing yaml framework]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=588</guid>
		<description><![CDATA[En alguna ocasión me he encontrado con que quería cambiar lo que Symfony entiende por un separador en la URL y nunca me acuerdo dónde se hace, así que lo escribo aquí por si a vosotros os ha pasado también alguna vez o no lo sabíais, y así la próxima vez también sé yo donde [...]]]></description>
			<content:encoded><![CDATA[<p>En alguna ocasión me he encontrado con que quería cambiar lo que <a href="http://www.berriart.com/category/symfony/">Symfony</a> entiende por un separador en la URL y nunca me acuerdo dónde se hace, así que lo escribo aquí por si a vosotros os ha pasado también alguna vez o no lo sabíais, y así la próxima vez también sé yo donde mirar. Explico lo que me pasaba con un ejemplo real de hace unos minutos mientras migraba <a href="http://efemerides20.com/">Efemerides 2.0</a>, proyecto al que me gustaría hacer unos cambios y ya de paso he pensado que no estaría mal pasarlo primero al framework Symfony.</p>
<p>Resulta que el proyecto tiene URLs como esta: <em>http://efemerides20.com/4-de-diciembre</em>. Dónde realmente estoy pasando dos variables por la URL: el 4 indicando el día, y &#8216;diciembre&#8217; indicando el mes. Así que en el archivo routing.yml de Symfony he creado la ruta así:</p>
<pre>day:
  url:   /:day-de-:month
  param: { module: efemeride, action: day }
  requirements: { month: \w+, day: \d+ }</pre>
<p>Cuando he accedido, me ha saltado error 404 diciéndome que no había niguna ruta que coincidiera con esa URL. EL problema es que por defecto Symfony no entiende los guiones como separadores en la URL, y solo interpreta como tales el punto &#8216;.&#8217; y la barra &#8216;/&#8217;. Si queremos cambiar esto y que la ruta definida funcione correctamente tenemos que añadir el punto a lo que Symfony entiende como separadores de segmentos en la URL. Para ello hay que modificar el fichero <em>factories.yml</em> de la aplicación en cuestión (en este caso frontend).</p>
<p>En ese fichero (<em>apps/modules/frontend/config/factories.yml</em>) hay un pequeño apartado dedicado al enrutamiento que seguramente y si no lo habéis cambiado pondrá lo siguiente:</p>
<pre>  routing:
    class: sfPatternRouting
    param:
      generate_shortest_url:            true
      extra_parameters_as_query_string: true</pre>
<p>Pues para hacer que nuestra ruta funcione solo hay que añadir un nuevo parámetro a esa configuración de la siguiente manera en mi caso:</p>
<pre>  routing:
    class: sfPatternRouting
    param:
      generate_shortest_url:            true
      extra_parameters_as_query_string: true
      <strong>segment_separators: ['/', '.', '-']</strong></pre>
<p>Es decir, añadir en el parámetro <em>segment_separators</em> todos los caracteres que querráis permitir como separadores.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2010/07/30/cambiar-separador-de-routing-en-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Añadir javascripts al final del código con Symfony</title>
		<link>http://www.berriart.com/2010/07/13/anadir-javascript-final-symfony/</link>
		<comments>http://www.berriart.com/2010/07/13/anadir-javascript-final-symfony/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 08:45:19 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[carga]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[mejora]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rapidez]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=546</guid>
		<description><![CDATA[Uno de los consejos que se suelen dar para mejorar el tiempo de carga de una web es añadir el Javascript al final de un documento web, justo antes de la etiqueta &#60;/body&#62;. Últimamente trabajo bastante con Symfony y por defecto los Javascript que se incluyen en los ficheros view.yml se cargan en la cabecera [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los consejos que se suelen dar para <a href="http://www.berriart.com/2010/07/08/mejora-el-tiempo-de-carga-de-tu-web-ii/">mejorar el tiempo de carga de una web</a> es añadir el Javascript al final de un documento web, justo antes de la etiqueta <em>&lt;/body&gt;</em>. Últimamente trabajo bastante con <a href="http://www.berriart.com/category/symfony/">Symfony</a> y por defecto los Javascript que se incluyen en los ficheros view.yml se cargan en la cabecera del documento (justo antes de la etiqueta  <em>&lt;/head&gt;</em>). Por eso generalmente hago algunas modificaciones para cambiar esto y ponerlos al final.</p>
<p>Esa inclusión se realiza en el filtro <a href="http://trac.symfony-project.org/browser/branches/1.4/lib/filter/sfCommonFilter.class.php">sfCommonFilter</a>, por lo tanto lo primero es crear un filtro que sustituirá a ese y que colocará los javascripts donde nosotros queremos, al final. Lo incluiremos en la carpeta <em>libs/filters</em> y en este caso se llamara <em>myProjectCommonFilter</em>:</p>
<pre name="code" class="php">
&lt;?php
/**
* myProjectCommonFilter Helper
*
* myProjectCommonFilter automatically adds javascripts to the bottom of the page and stylesheets to the top in the sfResponse content.
* This class is based in the sfCommonFilter helper of the symfony package.
*
* @package    symfony
* @subpackage filter
* @author     Alberto Varela &lt;alberto@berriart.com&gt;
* @version    2010-07-07
*/
class myProjectCommonFilter extends sfFilter
{
  /**
  * Executes this filter.
  *
  * @param sfFilterChain $filterChain A sfFilterChain instance
  */
  public function execute($filterChain)
  {
    // execute next filter
    $filterChain-&gt;execute();

    // execute this filter only once
    $response = $this-&gt;context-&gt;getResponse();

    // include stylesheets
    $content = $response-&gt;getContent();
    if (false !== ($pos = strpos($content, '&lt;/head&gt;')))
    {
      $this-&gt;context-&gt;getConfiguration()-&gt;loadHelpers(array('Tag', 'Asset'));

      if (!sfConfig::get('symfony.asset.stylesheets_included', false))
      {
        $html .= get_stylesheets($response);
      }

      if ($html)
      {
        $response-&gt;setContent(substr($content, 0, $pos).$html.substr($content, $pos));
      }
    }

    // include javascripts
    $content = $response-&gt;getContent();
    if (false !== ($pos = strpos($content, '&lt;/body&gt;')))
    {
      $this-&gt;context-&gt;getConfiguration()-&gt;loadHelpers(array('Tag', 'Asset'));
      $html = '';
      if (!sfConfig::get('symfony.asset.javascripts_included', false))
      {
        $html .= get_javascripts($response);
      }

      if ($html)
      {
        $response-&gt;setContent(substr($content, 0, $pos).$html.substr($content, $pos));
      }
    }

    sfConfig::set('symfony.asset.javascripts_included', false);
    sfConfig::set('symfony.asset.stylesheets_included', false);
  }
}
</pre>
<p>Ahora solo tenemos que decirle a Symfony que queremos utilizar este nuevo filtro en vez del sfCommonFilter y para eso tenemos que modificar el fichero <em>config/filters.yml</em> de nuestra aplicación y cambiar el filtro <em>common</em>:</p>
<pre>common:
  class: myProjectCommonFilter</pre>
<p>En un principio eso es todo, pero debéis tener cuidado si también escribís código Javascript directamente en la página sin usar ficheros externos. Tened en cuenta que siempre que ese código &#8216;inline&#8217; necesite utilizar alguna de las librerías externas deberá estar escrito por debajo de las llamadas a éstas y por lo tanto tendréis que modificar el filtro que os he puesto más arriba.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2010/07/13/anadir-javascript-final-symfony/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

