Archivos de Retrorock

Construyendo un Front Controller en PHP

Un front controller maneja todos los request en una aplicación web y está estructurado usualmente en dos partes, el request handler, que es donde se interpretan los parametros y se ejecuta la segunda parte, el command hierarchy que es el comando o acción que debe ejecutar la aplicación, tambien conocido como Page controller.

En las aplicaciones con PHP el esquema más comun es tener un archivo index.php y decida que acción tomar dependiendo de los parametros GET que reciba.

Esta imagen representa una forma bien sencilla de Front Controller, donde el archivo index.php recibe el nombre del script que va a cargar en el variable $_GET['page']. Los scripts (actions) están almacenadas en el folder pages.

Todo el que ha usado PHP por más de dos horas ha implementado de una manera u otra un page controller, aunque sea usando un if/else para ver si un formulario se envio.

En este ejemplo, el page controller es about.php. Podría tener un código como este:

Una estructura más organizada

Podemos tomar ventaja de la lógica que podemos realizar cuando estamos manejando el request HTTP para organizar mejor el codigo de nuestra aplicación.

Podemos separar la presentación de la logica guardando los page controllers y los templates en directorios distintos, Que los page controllers decidan que templates utilizar en cada request.

Se puede mejorar incluso la estructura de las URL’s enviando todos los requests al archivo index.php con un .htaccess. El archivo index.php (front controller) se va a encargar de llamar las acciones necesarias.

Para comenzar a organizar mejor el código de la aplicacion, vamos a crear un directorio con el nombre controllers, donde vamos a guardar todos los page controllers de la aplicacion. Luego creamos otro directorio con el nombre de views donde vamos a guardar todos los templates.

Usando $_SERVER['QUERY_STRING']

Si tenemos una URL como http://example.com/about $_SERVER['QUERY_STRING'] va a ser about, una como http://example.com/about/us va a ser about/us, lo que nos da una pista de como podemos usar la URL para definir la estructura de un request a nuestra aplicación. Nuestro front controller ahora va a decidir que page controller llamar y que accion o metodo ejecutar y que parametros aplicar a este llamado, todo dependiendo de la URL.

Esta vez el código del front controller luce así:

Línea por línea el front controller ahora hace lo siguiente:

  • Toma el QUERY_STRING y lo parte donde hay un / usando la función explode que lo convierte en un array.
  • Toma el primer elemento del array y lo usa como controller, si está vacío usa el default ‘home’.
  • Toma el segundo elemento del array y lo usa como action, si está vacío usa el default ‘index’.
  • Toma los elementos restantes para paserselos como parametros al action.
  • Incluye el controller desde el directorio controllers.
  • por último ejecuta el action.

El controller about tiene este código:

Como correr multiples aplicaciones con una instalación de Codeigniter

Por default se asume que vas a usar Codeigniter para manejar una sola aplicación, pero, debes saber que es posible correr varios sitios desde una misma instalación.

Cada sitio tendrá su propio folder application, pero todos van a compartir el mismo folder system.

Para que esto suceda debes mover la carpeta applications que viene por default dentro del folder system al root de nuestra instalación.

Luego busca en el index.php que está en el root de la instalación la línea que tiene: $application_folder = “application”; Y sustituyelo por: $application_folder = “../application”;

Ahora puedes copiar el folder application de system de nuevo al root de la instalación y renombrarlo a como quieras que se llame tu nueva aplicación. Cada aplicación debe tener su propio archivo index.php donde debes buscar la línea que tiene:  $system_folder = “system”; y sustituirla por: $system_folder = “../system”; y donde tiene: $application_folder = “application”; sustituirla por: $application_folder = “../admin”; cambia admin por el nombre del folder donde tienes esta aplicación.

Detecta un request Ajax con PHP

Me gusta usar un solo script para los request AJAX y los request “normales” porque resulta en un solo archivo para actualizar y editar.

Tener la capacidad de detectar que tipo de request recibimos es útil para determinar que tipo de contenido devolver en la respuesta. Por ejemplo, si es un request AJAX podríamos querer devolver un JSON o un XML y si no lo es, podríamos devolver un HTML.

Una manera de detectar los request AJAX contrario a los requests que hacen un page-load full puede ser con el siguiente código PHP:

$_SERVER['HTTP_X_REQUESTED_WITH'] es la clave para verificar si es request fue hecho con AJAX o no, pero no todos los servidores proveen esta variable, así que tener otras pruebas adicionales sería importante.

Programando CSS

Uno de los trucos mas interesantes asociados con CSS es la habilidad de generar hojas de estilo utilizando funcionalidad en el lado del servidor. Yo lo he usado para cambiar imágenes de fondo en la cabecera de websites, para generar paletas de colores dependiendo de las preferencias del usuario, y para un montón de cosas mas.

Hay dos componentes para generar CSS con un lenguaje como PHP. El primero es poder incorporar la hoja de estilos en la pagina. Para eso usamos el @import de CSS:

@import "backgrounds.php"

No importa si el archivo importado es un CSS estático mientras el MIME type sea text/css. En PHP esto se logra con la funcion header

header("Content-type: text/css");

El resto del archivo puede ser una combinación de bloques de PHP generando CSS o CSS estático, no importa.

Como había mencionado, uno de los usos de esta funcionalidad es cambiar la imagen de fondo en las cabeceras de las paginas, en esta ocasión lo vamos a ver cambiando la imagen de fondo de la pagina completa, para demostrar el uso de un CSS dinámico. Las imágenes van a estar en una carpeta y PHP va a seleccionar una de ellas aleatoriamente y creara las reglas de CSS necesarias para aplicarla al background de la pagina.

La aplicación genera un numero aleatorio entre 0 y el numero total de imágenes. Las imágenes están almacenadas en un Array y la imagen seleccionada es llamada con el numero aleatorio. Un ejemplo

La ventaja de esta técnica es que se pueden guardar las imágenes en una carpeta y dejar que la aplicación se encargue de seleccionar la imagen por ella misma.

Se puede usar esta técnica para seleccionar imágenes, colores, cambiar el tamaño de las fuentes, etc… La única limitante es mantener el CSS pequeño y rápido, no queremos que el CSS este lento y dure mucho cargando.

URLs limpias con Codeigniter

Estaba trabajando en una aplicación web para un cliente, un website inmobiliario. Luego de que todo estaba listo, funcionando perfecto en mi servidor local y en un servidor que uso para probar. Había un problema con las URLs en el servidor de Godaddy de mi cliente.

Las requests estaban dando un error: “No input file specified”, cosa que resolví poniendo “index.php” en el archivo de configuración. Pero quería remover el index.php de la URL.

Aquí hay un simple método para remover el “index.php” de las URLs en las aplicaciones en desarrolladas Codeigniter.

Hay que tener en cuenta que este método solo funciona para aplicaciones desarrolladas con Codeigniter, y aunque explica como quitar el “index.php” de las URLs, no quita la necesidad del archivo index.php, que es el Front Controller. Aunque index.php no aparezca en el URL debe estar presente el nivel del root de la aplicación.

Para que esto funcione debemos estar seguros de que nuestro Apache use el mod_rewite y que acepte configuraciones por medio de .htaccess, luego de estar seguros de esto debemos ejecutar los siguientes pasos:

  • Crear un .htaccess para configurar el engine de escritura de URLs (rewrite engine)
  • Asignar un string vacio a $config['index_page'] en el archivo config.php
  • Reiniciar el Apache y probar

1- Crear el archivo .htaccess

Crea un nuevo archivo llamado .htaccess y colocalo en tu directorio web.

2- Asignar un string vacio a $config['index_page'] en el archivo config.php

abre tu system/application/config/config.php

busca la linea que asigna $config['index_page'], usualmente:

$config['index_page'] = 'index.php';

y cambiala a:

$config['index_page'] = '';

Graba el archivo.

3- Reiniciar el Apache y probar

funciono??

Si no funciono, no te rindas, llenate de paciencia, prueba de nuevo todos los pasos y si aún así no funciona, postea en el foro con todos los detalles de tu instalación.

CodeIgniter a primera vista

He estado envuelto últimamente, durante todo el tiempo que tenía sin escribir aquí, en dos proyectos usando el Framework de PHP, Code Igniter. Siempre hé encontrado que los frameworks son rígidos, Codeigniter es todo lo contrario, que es lo que más me gusta. Se instala en un folder en el root de tu proyecto web, provee un framework MVC, una amplia gama de helpers y una gran cantidad de documentación.

Codeigniter hace que muchas cosas sean automáticas, pero no todo, lo que también es bueno. Para mi ha sido muy claro donde van las cosas y como hacerlas para lograr lo que he querido. También a sido muy fácil integrar fragmentos de código que tenía guardados aquí y allá.

Me parece lo suficientemente maduro para producción, es rapido, facilita las cosas para desarrollar agilmente y tiene una gran comunidad de usuarios, por lo que tengo planeado seguirlo usando para algunos proyectos que vienen por ahí, luego seguiré escribiendo sobre esto… y pronto pongo links a los proyectos.