<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8892413679519295083</id><updated>2011-11-27T16:43:15.641-08:00</updated><category term='mod_rewrite'/><category term='Zend_Controller'/><category term='Web handler'/><category term='.htaccess'/><category term='Front Controller Patterns'/><category term='command hierarchy'/><category term='arranque'/><category term='View Script'/><title type='text'>........ Experiencias php</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://evolucionphp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://evolucionphp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Washington Sosa</name><uri>http://www.blogger.com/profile/07780741963096683859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8892413679519295083.post-6906107249778133856</id><published>2007-09-26T07:03:00.001-07:00</published><updated>2007-09-26T07:52:51.025-07:00</updated><title type='text'>Foto del dia</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_WAOsjSt3UlA/RvpyDdEl9lI/AAAAAAAAACY/HQcPpfmo68k/s1600-h/trabajaria.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_WAOsjSt3UlA/RvpyDdEl9lI/AAAAAAAAACY/HQcPpfmo68k/s320/trabajaria.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5114525730501686866" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8892413679519295083-6906107249778133856?l=evolucionphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evolucionphp.blogspot.com/feeds/6906107249778133856/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8892413679519295083&amp;postID=6906107249778133856' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/6906107249778133856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/6906107249778133856'/><link rel='alternate' type='text/html' href='http://evolucionphp.blogspot.com/2007/09/foto-del-dia.html' title='Foto del dia'/><author><name>Washington Sosa</name><uri>http://www.blogger.com/profile/07780741963096683859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_WAOsjSt3UlA/RvpyDdEl9lI/AAAAAAAAACY/HQcPpfmo68k/s72-c/trabajaria.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8892413679519295083.post-878475171960120437</id><published>2007-09-14T08:12:00.000-07:00</published><updated>2007-09-14T09:04:39.387-07:00</updated><title type='text'>Front Controller pattern</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Intentando una definicion desde java&lt;/span&gt;&lt;br /&gt;El diseño de aplicaciones Web basadas en los Patrones J2EE se organiza alrededor de la utilización de varios elementos: un controlador frontal, dispatchers (despachadores), vistas compuestas (composite views), vistas (JSPs) y los helpers (ayudantes) de las vistas (JavaBeans).&lt;br /&gt;&lt;br /&gt;Todos estos elementos se pueden organizar en el siguiente diseño, que ejemplifica un diseño basado en los patrones:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_WAOsjSt3UlA/RuqluzhJi2I/AAAAAAAAABk/pr-LkD3dVaA/s1600-h/servicetoworker.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_WAOsjSt3UlA/RuqluzhJi2I/AAAAAAAAABk/pr-LkD3dVaA/s320/servicetoworker.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5110078950727060322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Describamos la función basica de cada uno de estos elementos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;Front Controller (controlador frontal).&lt;/blockquote&gt;&lt;/span&gt; Este elemento provee un controlador centralizado para gestionar las peticiones webs a la aplicación. Un controlador frontal recibe todas las peticiones entrantes de los clientes, remitiendo a su vez cada petición al gestor de peticiones (Dispatcher) adecuado, que se encargará de gestionar la construcción de una respuesta adecuada al cliente. Son los puntos ideales para implementar servicios de seguridad, tratamiento de errores, y la gestión del control para la generación de contenidos.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;Dispatcher.&lt;/blockquote&gt;&lt;/span&gt; Tendremos toda una colección de estos elementos. En cada uno codificaremos la construcción de la respuesta al usuario. Básicamente lo que hacen es componer vistas y configurar estas para que muestren la información adecuada como respuesta a la petición del usuario.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;Composite View (Vista Compuesta).&lt;/blockquote&gt;&lt;/span&gt; Este patrón hace que la representación de vistas sea más manejable ya que gestiona los diferentes elementos de una página por medio de una plantilla. Frecuentemente, las páginas webs contienen una combinación de contenido dinámico y elementos estáticos, tales como cabeceras, pies, logos, imágenes de fondo, etc. La parte dinámica es particular para cada página, pero los elementos estáticos suelen ser los mismos para todas las páginas. La plantilla de la vista compuesta captura estas características comunes. La integración debe ser dinámica, siendo el Composite View básicamente un layout (diseño, esquema) que componga dicha página.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;Vistas (Views).&lt;/blockquote&gt;&lt;/span&gt;Se encargan de generar contenido visual específico que responda a las necesidades del usuario. Dichas paginas por lo general estarán parametrizadas de tal forma que muestren diferente información según los parámetros que le mandemos. Por lo general una vista produce un trozo de la página web que recibe el usuario.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;View Helper (Ayudante o Auxiliar de Vista).&lt;/blockquote&gt;&lt;/span&gt; Un ‘View Helper’ encapsula los trozos de lógica (código de programa) correspondientes a la presentación y al acceso a datos y componentes que necesita una vista, haciendo que la vista permanezca de esta forma mucho más simple, reutilizable y mantenible. La lógica de presentación se encarga de formatear datos para que sean visualizados en una página, mientras que el acceso a datos o componentes implica la obtención de datos.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Diagrama de Participantes y Responsabilidades&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/images07/figure07_08.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://java.sun.com/blueprints/corej2eepatterns/Patterns/images07/figure07_08.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8892413679519295083-878475171960120437?l=evolucionphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evolucionphp.blogspot.com/feeds/878475171960120437/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8892413679519295083&amp;postID=878475171960120437' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/878475171960120437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/878475171960120437'/><link rel='alternate' type='text/html' href='http://evolucionphp.blogspot.com/2007/09/front-controller-pattern.html' title='Front Controller pattern'/><author><name>Washington Sosa</name><uri>http://www.blogger.com/profile/07780741963096683859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_WAOsjSt3UlA/RuqluzhJi2I/AAAAAAAAABk/pr-LkD3dVaA/s72-c/servicetoworker.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8892413679519295083.post-457823022214388847</id><published>2007-09-13T04:52:00.000-07:00</published><updated>2007-09-14T08:02:13.035-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Front Controller Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='Web handler'/><category scheme='http://www.blogger.com/atom/ns#' term='command hierarchy'/><category scheme='http://www.blogger.com/atom/ns#' term='Zend_Controller'/><category scheme='http://www.blogger.com/atom/ns#' term='View Script'/><title type='text'>Zend_Controller quick start (del manual de zend framework)</title><content type='html'>&lt;strong&gt;Introduccion&lt;/strong&gt;&lt;br /&gt;Zend_Controller es el corazon del sistema Zend Framework's MVC.&lt;br /&gt;MVC es el soporte para el modelo &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;Model-View-Controller &lt;/a&gt;, el cual es un patron de diseño que apunta a separar la logica de la aplicacion de la logica de la presentacion.&lt;br /&gt;Zend_Controller_front implementa a &lt;a href="http://www.martinfowler.com/eaaCatalog/frontController.html"&gt;Front Controller&lt;/a&gt; pattern, en el cual todas las paticiones son interceptadas por el front controller y despachadas a un Action Controllers individual basados en la URL solicitada.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_WAOsjSt3UlA/RuqgNThJi1I/AAAAAAAAABc/9I8pstRZB0M/s1600-h/fig2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_WAOsjSt3UlA/RuqgNThJi1I/AAAAAAAAABc/9I8pstRZB0M/s320/fig2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5110072877643303762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Descripcion Front Controller Patterns.&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;El Front Controller maneja todos los requerimientos de una aplicacion basada en Web decidiendo que es lo siguiente que sucederá.&lt;br /&gt;Es un patterns bien conocido en la especificacion de J2EE y comun su uso en frameworks como Jakarta Struts. &lt;br /&gt;&lt;br /&gt;Martin Fowler, en "Patterns of Enterprise Application Architecture" realiza un buen trabajo discutiendo en general las entradas y salidas de un Front Controller, las que resume de la siguiente manera:&lt;br /&gt;&lt;br /&gt;“Un Front Controller maneja todas las llamadas a un sitio Web, y es generalmente estrucurado en dos partes: un manejador Web( Web handler) y una jerarquia de comandos(a command hierarchy).” &lt;br /&gt;&lt;br /&gt;El termino “Web handler” se refiere a la logica que examina las solicitudes entrantes HTTP para recoletar la suficiente informacion para saber que hacer con ella, mientras el “command hierarchy” es una especie de estructura organizacional, donde el Front Controller hace referencia a él, para decidir que es lo proximo a hacer, basado en la informacion brindada por el “Web handler”. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;El sistema de Zend_Controller fue construido pensando en su extensibilidad, donde podemos realizar sub clases de las clases existentes, escribiendo las nuevas clases que ponen en ejecucion las diversas interfaces y las clases abstractas que forman el conjunto de clases de la familia controller, o escribiendo plugins o action helpers para aumentar o para manipular la funcionalidad del sistema.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo.&lt;/strong&gt;&lt;br /&gt;Crear la siguiente estructura de directorios.&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;br /&gt;application/&lt;br /&gt;    controllers/&lt;br /&gt;        IndexController.php&lt;br /&gt;    models/&lt;br /&gt;    views/&lt;br /&gt;        scripts/&lt;br /&gt;            index/&lt;br /&gt;                index.phtml&lt;br /&gt;        helpers/&lt;br /&gt;        filters/&lt;br /&gt;html/&lt;br /&gt;    .htaccess&lt;br /&gt;    index.php&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ahora en tu web server, señala tu documento raiz al directorio HTML de la disposición antedicha del sistema de ficheros.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Crea tus reglas rewrite&lt;/strong&gt;&lt;br /&gt;editar el html/.htaccess para que quede de la siguiente manera.&lt;br /&gt;&lt;br /&gt;RewriteEngine on&lt;br /&gt;RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php&lt;br /&gt;&lt;br /&gt;Las reglas antedichas encaminarán cualquier petición del "no-recurso" (imágenes, stylesheets) al front controller. Si existen otras extensiones que desea excluir del front controller (PDF's,text files,etc), agregue esas extenciones al switch, o cree sus propias reglas rewrite.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cree su propio archivo bootstrap &lt;/strong&gt;&lt;br /&gt;El archivo bootstrap es la pagina donde todos los requerimientos son ruteados --&lt;em&gt;html/index.php&lt;/em&gt; en nuestro ejemplo.&lt;br /&gt;&lt;code&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php &lt;br /&gt;require_once 'Zend/Controller/Front.php';&lt;br /&gt;Zend_Controller_Front::run('/path/to/app/controllers')&lt;br /&gt;&lt;/span&gt; &lt;/code&gt;&lt;br /&gt;Antes de discutir las acciones del controlador, deberiamos primero entender como las solicitudes son ruteadas en Zend Framework. Por defecto, el primer segmento del la URL mapea el controlador, y el segundo la accion. Por ejemplo dada la siguiente URL http://framework.zend.com/roadmap/components, el camino es /roadmap/components, la cual mapeara el controlador &lt;em&gt;roadmap&lt;/em&gt; y la accion &lt;em&gt;components&lt;/em&gt;.&lt;br /&gt;En el caso de no proporcionar una accion, la accion &lt;em&gt;index&lt;/em&gt; is asumida, y si no se ha proporcionado un controlador, el controlador &lt;em&gt;index&lt;/em&gt; es asumido, (después de la convención de Apache que mapea un &lt;em&gt;DirectoryIndex&lt;/em&gt; automáticamente).&lt;br /&gt;&lt;br /&gt;El despachador de Zend_Controller despues toma el valor controlador y lo mapea a su clase. Por defecto, toma el nombre del controlador y le agrega la palabra controller. En el caso anterior el controlador roadmap es mapeado a la clase RoadmapController&lt;br /&gt;&lt;br /&gt;De manera similar la "accion" es mapeada al metodo de la clase controladora. Por defecto, el valor es en minusculas, y luego la palabra &lt;em&gt;"Action"&lt;/em&gt; es agregada. En nuestro ejemplo la accion &lt;em&gt;components&lt;/em&gt; se transforma en &lt;em&gt;componentsAction&lt;/em&gt;, y el metodo final es llamado de la sigiente manera:&lt;br /&gt;&lt;em&gt;RoadmapControler::componentsAction();&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Vamos a crear una accion controladora por defecto y un metodo accion. Como lo mencionamos con anterioridad, el controlador por defecto y la accion son llamados ambos &lt;em&gt;"index"&lt;/em&gt;. Abrimos el archivo application/contollers/IndexController.php, y digitamos lo siguiente&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/** Zend_Controller_Action */&lt;br /&gt;require_once 'Zend/Controller/Action.php';&lt;br /&gt;&lt;br /&gt;class IndexController extends Zend_Controller_Action&lt;br /&gt;{&lt;br /&gt;    public function indexAction()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por defecto la accion del ayudante ViewRenderer esta habilitada. Lo qie esto significa es que simplemete definiendo un metodo action y su correspondiente script view, se obtendra inmediatamente el contenido volcado. Por defecto , Zend_View es usado como la capa de vista(view layer) del MVC. El &lt;em&gt;VewRenderer&lt;/em&gt; hace algo magico, y usa el nombre del controlador (ej. index) y su actual nombre de accion (ej. index) que template usar. Por defecto los template tienen la extension .phtml, esto significa que , en el ejemplo anteriror, el template index/index.phtml sera ejecutado, adicionalmente el ViewRenderer automaticamente asume que el directorio de las vistas , y que el el actual view script estaran en el subdirectorio /views/scripts/, ademas, el templete mostrado lo podremos encontrar en application/views/scripts/index/index.phtml.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Creando nuestro View Script&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Como mencionamos anteriormente , los view scripts son encontrados en application/views/scripts/; el ciew script por defecto para el controlador y la accion estan en application/views/scripts/index/index.phtml, por lo tanto vamos a crear este archivo y escribirle agun codigo html:&lt;br /&gt;&lt;code&gt;&lt;span style="color: #0000BB"&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html&lt;br /&gt;PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;My first Zend Framework App&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;h1&amp;gt;Hello, World!&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;   &lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Crear nuestro controlador de errores (error controller)&lt;/strong&gt;&lt;br /&gt;por defecto esta registrado el plugin manejador de errores. Este plugin espera que exista un controlador para el manejo de errores. Por defecto. este asume un ErrorController en el modilo por defecto con un metodo errorAction:&lt;br /&gt;&lt;pre class="programlisting"&gt;&amp;lt;?php&lt;br /&gt;/** Zend_Controller_Action */&lt;br /&gt;require_once 'Zend/Controller/Action.php';&lt;br /&gt;&lt;br /&gt;class ErrorController extends Zend_Controller_Action&lt;br /&gt;{&lt;br /&gt;    public function errorAction()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si se asume que la disposición de directorios es la ya discutida, este archivo entrará en application/controllers/ErrorController.php. Tambien se necesitara crear un view script en application/views/scripts/error/error.phtml, donde el contenido de ejemplo puede lucir de la siguiente forma.&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html&lt;br /&gt;PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;Error&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;h1&amp;gt;An error occurred&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;p&amp;gt;An error occurred; please try again later.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Vista del sitio&lt;/strong&gt;&lt;br /&gt;Con tu primer controlador y vista (view) bajo nuestro dominio, puedemos ahora acceder desde nuestro browser y hojear al sitio. Si se asume que example.com es tu dominio,accediento a cualquiera de las siguientes URL's obtendremos la pagina que acabamos de crear.&lt;br /&gt;    *http://example.com/&lt;br /&gt;    *http://example.com/index&lt;br /&gt;    *http://example.com/index/index&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8892413679519295083-457823022214388847?l=evolucionphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evolucionphp.blogspot.com/feeds/457823022214388847/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8892413679519295083&amp;postID=457823022214388847' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/457823022214388847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/457823022214388847'/><link rel='alternate' type='text/html' href='http://evolucionphp.blogspot.com/2007/09/zendcontroller-quick-start-del-manual.html' title='Zend_Controller quick start (del manual de zend framework)'/><author><name>Washington Sosa</name><uri>http://www.blogger.com/profile/07780741963096683859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_WAOsjSt3UlA/RuqgNThJi1I/AAAAAAAAABc/9I8pstRZB0M/s72-c/fig2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8892413679519295083.post-1879083570133159182</id><published>2007-09-10T04:43:00.000-07:00</published><updated>2007-09-10T07:57:01.451-07:00</updated><title type='text'>Clase Zend_Loader (extraido del manual oficial de Zend_Framework)</title><content type='html'>La clase Zend_Loader incluye metodos para ayudarte a cargar archivos dinamicamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Zend_Loader vs. require_once()&lt;/span&gt;&lt;br /&gt;El metodo Zend_Loader es usado si el nombre de archivo que necesitas cargar es variable.&lt;br /&gt;Por Ejemplo si éste se basa en un parametro en una entrada de usuario , o pasado como argumento de un metodo.&lt;br /&gt;Si estas cargando un archivo o una clase cuyo nombre es "constante", no existen beneficios de Zend _loader sobre el uso tradicional de funciones PHP como lo puede ser "requiere_once()"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cargando archivos&lt;/span&gt;&lt;br /&gt;El metodo estatico Zend_Loader::loadFile() lee un archivo PHP que pude contener cualquier tipo de codigo PHP. &lt;br /&gt;El metodo es un wrapper (lo que se define como un pequeño programa o script, escrito para encapsular grandes programas),para la funcion de PHP include(). Este metodo lanza Zend_Exception en una falla, por ejemplo:si el archivo especificado no existe.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo del metodo loadFile()&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;&amp;lt;?php &lt;br /&gt;Zend_Loader::loadFile($filename, $dirs=null, $once=false);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;el parametro o argumento $filename especifica el archivo a ser leido, el cual no debe contener ninguna informacion de su ubicacion. Un chequeo de seguridad es ejecutado sobre $filename en donde éste solo debe contener caracteres alfanumericos,o tambien dashes ("-"), underscores ("_"), o puntos ("."). No se pone ninguna otra restriccion en la discusion de $dirs.&lt;br /&gt;&lt;br /&gt;El argumento $dirs especifica el directorio donde sera buscado el archivo, si este es  NULL, solamente el es buscado en include_path. Si existe un string o un array, con directorio o directorios el archivo será buscado en los mismos y por ultimo en el include_path.&lt;br /&gt;&lt;br /&gt;El argumento $once es booleano. Si éste es TRUE Zend_Loader::loadFile() usa la funcion de PHP include_once() para leer el archivo,de lo contrario la funcion include() sera usada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cargando Classes&lt;/span&gt;&lt;br /&gt;El metodo estatico Zend_Loader::loadClass($class, $dirs) lee una archivo de clase PHP y despues chequea la existencia de la clase. &lt;br /&gt;&lt;br /&gt;Ejemplo del metodo loadClass()&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;Zend_Loader::loadClass('Container_Tree',&lt;br /&gt;    array(&lt;br /&gt;        '/home/production/mylib',&lt;br /&gt;        '/home/production/myapp'&lt;br /&gt;    ));&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;            &lt;br /&gt;&lt;br /&gt;El String que especifica la clase es convertido a un path relativo mediante la sustitucion de los directorios separados por 'underscores' y agregandole '.php'. En el ejemplo anterior, 'Container_Tree' se transforma en 'Container/Tree.php'. &lt;br /&gt;&lt;br /&gt;El argumento $dirs puede ser un string o un array, Zend_Loader::loadClass() &lt;br /&gt;busca los directorios en el orden suministrado. El primer archivo encontrado es leido. Si el archivo no existe en $dirs, entonces es buscado en el include_path del entorno PHP &lt;br /&gt;&lt;br /&gt;Si el archivo no es encontrado o la clase no existe ,entonces Zend_Loader::loadClass() lanza Zend_Exception. &lt;br /&gt;&lt;br /&gt;Zend_Loader::loadFile() es usado para la carga , pero el nombre de la clase solo puede contener caracteres alfanumericos y el hyphen ('-'), underscores ('_'), y el punto('.').&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Testeando si un archivo es leible.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El metodo estatico Zend_Loader::isReadable($pathname) retorna TRUE si el archivo especificado en $pathname existe y es leible, de lo contrario FALSE .&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ejemplo del metodo isReadable()&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;if (Zend_Loader::isReadable($filename)) {&lt;br /&gt;    // do something with $filename&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;            &lt;br /&gt;&lt;br /&gt;El argumento $filename especifica el archivo a ser chequeado. Este puede contener informacion del camino. &lt;br /&gt;Este metodo es un wrapper para la funcion PHP is_readable(). La funcion PHP &lt;blockquote&gt;no busca&lt;/blockquote&gt; en include_path, mientras Zend_Loader::isReadable() si lo hace.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usando el Autoloader&lt;/span&gt;&lt;br /&gt;La clase de Zend_Loader contiene un método que puede colocarse con el autoloader del SPL de PHP. Zend_Loader::autoload() es un método de servicio repetido. Como conveniencia, Zend_Loader proporciona el registro de la función del registerAutoload() su método autoload(). Si la extensión del spl_autoload no está presente en tu ambiente de PHP, entonces el método del registerAutoload() lanza un Zend_Exception.&lt;br /&gt;&lt;br /&gt;Ejemplo de registracion del metodo autoloader&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ejemplo del metodo isReadable()&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;Zend_Loader::registerAutoload();&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;            &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;despues de registrar el Zend Framework autoload callback,puedes referenciar las clases desde Zend Framework sin tenerla que cargarlas explicitamente. El metodo autoload() usa Zend_Loader::loadClass() automaticamente cuando la clase es referenciada.&lt;br /&gt;&lt;br /&gt;Si has extendido la clase Zend_Loader, tu puedes darle un argumento opcional al registerAutoload(), para especificar la clase de la cual colocar un método del autoload().&lt;br /&gt;&lt;br /&gt;Ejemplo de registrando el metodo autoload callback desde una clase extendida&lt;br /&gt;&lt;br /&gt;Debido a la semantica de las referencias estaticas en PHP, debes implementar codigo para ambas loadClass() y autoload(); y el autoload() debe llamar self::loadClass(). Si el metodo autoload() delega a su padre el llamar a self::loadClass(), entoces llama al metodo con ese nombre en la clase del padre, no en la subclase.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ejemplo del metodo isReadable()&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;class My_Loader extends Zend_Loader&lt;br /&gt;{&lt;br /&gt;    public static function loadClass($class, $dirs = null)&lt;br /&gt;    {&lt;br /&gt;        parent::loadClass($class, $dirs);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static function autoload($class)&lt;br /&gt;    {&lt;br /&gt;        try {&lt;br /&gt;            self::loadClass($class);&lt;br /&gt;            return $class;&lt;br /&gt;        } catch (Exception $e) {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;} &lt;br /&gt;Zend_Loader::registerAutoload('My_Loader');&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8892413679519295083-1879083570133159182?l=evolucionphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evolucionphp.blogspot.com/feeds/1879083570133159182/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8892413679519295083&amp;postID=1879083570133159182' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/1879083570133159182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/1879083570133159182'/><link rel='alternate' type='text/html' href='http://evolucionphp.blogspot.com/2007/09/clase-zendloader.html' title='Clase Zend_Loader (extraido del manual oficial de Zend_Framework)'/><author><name>Washington Sosa</name><uri>http://www.blogger.com/profile/07780741963096683859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8892413679519295083.post-7893658124227898266</id><published>2007-09-04T05:05:00.000-07:00</published><updated>2007-09-04T10:44:20.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arranque'/><category scheme='http://www.blogger.com/atom/ns#' term='mod_rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='.htaccess'/><title type='text'>Empezando con Zend - Framework</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Bootstrapping (Configuración de Arranque)&lt;/span&gt;&lt;br /&gt;El controlador (controller) de Zend FrameWork, Zend_Controller se diseño para ofrecer sitios Web con direcciones url claras. Para lograr esto, todas las peticiones deberán ser procesadas únicamente por un archivo index.php. Asi se ofrece un punto central para todas las páginas de la aplicación y asegura la instalación de un ambiente correcto para ejecutar la aplicación. Esto se logra mediante el uso de un archivo &lt;span style="font-weight:bold;"&gt;.htaccess&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt; (que es utilizado por el modulo mod_rewrite del servidor web apache)dentro del directorio raíz de zf-tutorial:&lt;br /&gt;zf-tutorial/.htaccess&lt;br /&gt;    RewriteEngine on&lt;br /&gt;    RewriteRule .* index.php&lt;br /&gt;    php_flag magic_quotes_gpc off&lt;br /&gt;    php_flag register_globals off&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Funcionamiento&lt;/span&gt;&lt;br /&gt;Apache usa archivos con el nombre de .htaccess para que el administrador de las páginas web pueda definir una serie de parámetros de configuración para su espacio. Deben estar ubicados en el directorio sobre el que quieras aplicar esa configuración.&lt;br /&gt;&lt;br /&gt;Crear este tipo de archivos en plataformas Microsoft Windows puede ser un problema, ya que este no permite poner archivos sin nombre pero ello no significa que no se pueda hacer.&lt;br /&gt;&lt;br /&gt;El archivo se puede crear de varias maneras, utilizando PHP bastaria con poner algo como lo siguiente para crear el archivo:&lt;br /&gt;&lt;code class="block"&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;touch&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'.htaccess'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Comprobar que tenemos activado mod_rewrite&lt;/span&gt;&lt;br /&gt;Podemos hacer lo siguiente&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;echo phpinfo();&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;Si Apache está como módulo de PHP entonces podemos revisar en los módulos que tiene cargados, en el cual mod_rewrite está entre ellos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Configuracion .htaccess&lt;/span&gt;&lt;br /&gt;Como primer paso deberemos poner al principio del archivo .htaccess la cadena RewriteEngine On, que se encarga de activar el módulo de reescritura, tras poner esto ya debemos poder empezar a escribir nuestras reglas para formatear las direcciones como nos plazca. A veces puede ser necesario poner un Options FollowSymLinks antes para que funcione, de modo que quedaría así:&lt;br /&gt;&lt;br /&gt;Options FollowSymLinks&lt;br /&gt;RewriteEngine On&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Funciones o comandos del mod_rewrite&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La sintaxis de los comandos del mod_rewrite es bastante sencilla y rápida de entender. Los comandos empiezan con Rewrite y normalmente el patrón de sintaxis es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Comando Parámetro1 Parámetro2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aunque en algunos casos varía ligeramente, como se verá a continuación:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteEngine&lt;/span&gt;&lt;br /&gt;Solo acepta dos valores para su único parámetro: On y Off. Le dice a Apache una vez puesto en el .htaccess si debe o no iniciar el motor de reescritura. Está desactivado por defecto.&lt;br /&gt;&lt;br /&gt;#Para activar la reescritura&lt;br /&gt;RewriteEngine On&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteBase&lt;/span&gt;&lt;br /&gt;Nos permite ajustar una "base" para las rutas que escribamos. Lo que hace es añadir a las rutas siguientes el prefijo que indiquemos, esto puede ahorrar mucho espacio y es necesario muchas veces al no encontrarse el archivo .htaccess en el mismo directorio sobre el que se quiere aplicar (por eso es recomendable ponerlo ahí).&lt;br /&gt;ejemplo&lt;br /&gt;     RewriteRule ^/pagina/index.xml$ /pagina/xml.php?generar=xml&lt;br /&gt;     #Con RewriteBase nos podemos ahorrar el /pagina/ de la siguiente forma:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;     RewriteBase /pagina/&lt;br /&gt;     RewriteRule ^index.xml$ xml.php?generar=xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;RewriteCond&lt;/span&gt;&lt;br /&gt;Permite definir sentencias condicionales, la sintaxis es muy simple y fácil de entender. Se pueden unir varias condiciones con el modificador OR.&lt;br /&gt;&lt;br /&gt;A continuación de este comando se debe poner o bien otro RewriteCond (usando el modificador para unirlos) o bien un RewriteRule, que es el que se debe ejecutar en última instancia en caso de cumplirse la(s) condicion(es). En caso de no cumplirse la condición el RewriteRule sería ignorado.&lt;br /&gt;&lt;br /&gt;#RewriteCond Cadena Patrón&lt;br /&gt;#Si la dirección contiene "pepe" se ejecuta el RewriteRule que habría debajo&lt;br /&gt;RewriteCond %{REQUEST_URI} pepe&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteRule&lt;/span&gt;&lt;br /&gt;Posiblemente este sea el comando que más usaremos. Es el pilar para lo que queremos hacer, ya que de el depende que se lleve a cabo la reescritura.&lt;br /&gt;Lo que hace es simple: le das un patrón y una URI de destino, si el patrón coincide se llama a la URI especificada con los parámetros que se haya indicado. Las referencias hacia los valores agrupados con paréntesis en las &lt;a href='http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular'&gt;expresiones regulares&lt;/a&gt; del patrón pueden ser referidas como $1, $2… hasta $9.&lt;br /&gt;&lt;br /&gt;Aquí es donde las &lt;a href='http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular'&gt;expresiones regulares&lt;/a&gt; juegan un papel importante, al ser con lo que haremos los patrones de comparación. Es importante conocer su sintaxis básica y poder manejarse con soltura para crear reglas efectivas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modificadores de RewriteRule&lt;/span&gt;&lt;br /&gt;Esto son las flags de las que se habla en el manual oficial,a los cuales los llamaremos modificadores. Los modificadores sirven para añadir características extra a ciertos comandos del mod_rewrite, como RewriteRule o RewriteCond.&lt;br /&gt;&lt;br /&gt;Cada comando tiene sus propios modificadores. Se ponen entre corchetes, tras un espacio al final del comando y se separan (en caso de especificar más de uno) con comas y sin espacios.&lt;br /&gt;&lt;br /&gt;Solo mencionaremos los pertenecientes a RewriteRule que me parecen más útiles para lo que estamos haciendo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Por encima, los modificadores que más nos interesan son los siguientes:&lt;br /&gt;nocase (NC)&lt;/span&gt;&lt;br /&gt;Este útil modificador hará que las &lt;a href='http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular'&gt;expresiones regulares&lt;/a&gt; (o simplemente cadenas literales) que pongamos como patrón sean case-insensitive, es decir, que no se distinga entre mayúsculas y minúsculas. Esto nos puede venir bien muchas veces.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;redirect (R[=codigo])&lt;/span&gt;&lt;br /&gt;Permite redireccionar a una dirección con un código concreto de respuesta del protocolo HTTP. El rango, según el manual oficial, debe estar entre el código 300 (HTTP_MULTIPLE_CHOICES) y 400 (HTTP_BAD_REQUEST). Para conocer el significado de esas constantes y los códigos que puedes usar debes consultar este protocolo.&lt;br /&gt;&lt;br /&gt;Suele interesar que, al redireccionar por este metodo, el archivo .htaccess no siga siendo interpretado, para lo que usaremos el modificador L.&lt;br /&gt;&lt;br /&gt;Por defecto, si no se especifica un codigo, se pone automáticamente el 302 (MOVED TEMPORARILY).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;last (L)&lt;/span&gt;&lt;br /&gt;Este modificador hace que la condición, en caso de que se cumpla, sea la última en interpretarse del archivo. En caso de no cumplirse seguirá su curso normal. Es bueno especificarlo casi siempre, ya que le va a ahorrar a Apache la interpretación del resto de reglas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Construcción de reglas o patrones&lt;/span&gt;&lt;br /&gt;Puedes construir tantas reglas como quieras, pero ten en cuenta que, cuanto más pesado el archivo, más le costará de interpretar a Apache. No se recomienda que pases de los 2KB (que ya es mucho).&lt;br /&gt;&lt;br /&gt;Se usan patrones basados en &lt;a href='http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular'&gt;expresiones regulares&lt;/a&gt; (de tipo POSIX a partir de Apache 1.2.x) de manera que, si coinciden, se redirija al archivo que especifiquemos. Es realmente simple crear &lt;a href='http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular'&gt;expresiones regulares&lt;/a&gt; para hacer las URIs como las de esta página. Dos buenos manuales para aprender a hacer &lt;a href='http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular'&gt;expresiones regulares&lt;/a&gt; efectivas son los siguientes:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;    * Expresiones regulares, por Iván Arias&lt;br /&gt;    * Expresiones regulares en Ignside&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es muy importante que delimitemos el rango de caracteres correcto acorde a nuestra necesidad. Si necesitamos obtener un número… ¿para que permitir letras u otros símbolos en el patrón? Esto nos ahorrará quebraderos de cabeza posteriores en lo referente a la seguridad de la aplicación final.&lt;br /&gt;&lt;br /&gt;También suele ser necesario que, en las direcciones que puedan terminar con o sin barra, indiquemos esta eventualidad (es decir, que pongamos la barra del final como caracter opcional), algo como lo siguiente:&lt;br /&gt;RewriteRule ^seccion/([0-9]+)/?$ index.php?seccion=$1&lt;br /&gt;&lt;br /&gt;En el caso de que la barra opcional no está contemplada y es escrita en la dirección se lanzaría un error de tipo 404 (Página no encontrada).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ejemplos de la vida real&lt;/span&gt;&lt;br /&gt;Lo que vamos a hacer en el siguiente ejemplo es obtener y enviar un identificador numérico a partir de una URL de tipo example.com/articulo/identificador_numérico, o sea, tomar el número y pasárselo a una aplicación:&lt;br /&gt;&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteRule ^articulo/([0-9]+)/?$ articulos.php?id=$1 [L]&lt;br /&gt;&lt;br /&gt;Si quisieramos obtener el nombre de la sección de ese artículo (a partir de una dirección tipo &lt;span style="font-style:italic;"&gt;example.com/articulo/sección/identificador_numérico&lt;/span&gt;) sería muy sencillo también:&lt;br /&gt;#La sección puede contener letras, guiones y guiones bajos&lt;br /&gt;RewriteRule ^articulo/([a-z_-]+)/([0-9]+)/?$ articulos.php?seccion=$1&amp;id=$2 [NC,L]&lt;br /&gt;&lt;br /&gt;Ojo porque el identificador ya no está en $1, sino en $2, ya que es el segundo grupo de captura que hemos indicado. Al interesarnos tanto letras minúsculas como mayúsculas debemos poner el modificador NC.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Problema común y final del escrito&lt;/span&gt;&lt;br /&gt;Suele pasar que al usar el mod_rewrite por primera vez, después de haber hecho funcionar sus primeros patrones, etc. diga… ¡No me funcionan los enlaces! ¡No me carga la hoja de estilos! Bien, esto es muy fácilmente solucionable y totalmente previsible. Solo debemos poner la dirección "base" de la página hacia el dominio principal y hacer las demás rutas relativas. Para esto tenemos el elemento &lt;code&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;base /&amp;gt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;de XHTML:&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;head&amp;gt&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000BB"&gt;&amp;lt;base href= "http://www.example.com/" /&amp;gt&lt;/span&gt;&lt;br /&gt;    …&lt;br /&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;/head&amp;gt&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para obtener infomracion mas detallado sobre el comando &lt;span style="font-weight:bold;"&gt;modrewrite.com&lt;/span&gt; y sus foros de ayuda&lt;br /&gt;Tambien podemos utilizar la siguiente pagina como &lt;a href='http://www.mod-rewrite-wizard.com/'&gt;wizard&lt;/a&gt; de ayuda para crear sentencias http://www.mod-rewrite-wizard.com/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Como activar el modulo mod_rewrite en XAMPP&lt;/span&gt;&lt;br /&gt;editar el archivo xampp\apache\conf\httpd.conf&lt;br /&gt;busca la linea #LoadModule rewrite_module modules/mod_rewrite.so y quitarle el simbolo # , como paso siguiente se debe reiniciar el servidor apache&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8892413679519295083-7893658124227898266?l=evolucionphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evolucionphp.blogspot.com/feeds/7893658124227898266/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8892413679519295083&amp;postID=7893658124227898266' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/7893658124227898266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8892413679519295083/posts/default/7893658124227898266'/><link rel='alternate' type='text/html' href='http://evolucionphp.blogspot.com/2007/09/empezando-con-zend-framework.html' title='Empezando con Zend - Framework'/><author><name>Washington Sosa</name><uri>http://www.blogger.com/profile/07780741963096683859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
