Al comenzar a trabajar con el lenguaje de programación PHP, puede resultar algo desorientador descifrar cómo es la mejor forma de organizar nuestro proyecto.
Si alguna vez has estado confundido sobre en dónde poner tus imágenes, galerÃas externas, o cómo mantener tu lógica separada del diseño, estos consejos te resultarán muy útiles y te guiarán en la dirección correcta.
Estructura del directorio
PodrÃa decirse que lo más importante para iniciar rapidamente tu proyecto PHP es poseer una estructura de directorio sólida que podamos reutilizar en multiples proyectos.
Irrupción
- Seguramente estás muy familiarizado con la estructura public_html. Ésta es la ruta de documento en la que son accedidos todos tus archivos públicos. (por ejemplo, a example.com/page.php se accede a través de /public_html/page.php).
- img – Todos tus archivos de imágenes.
- css – Todos tus archivos CSS.
- js – Todos tus archivos Javascript.
- El directorio resources deberÃa contener todas las librerÃas de terceros, configs y todo otro código que funcione como recurso en tu proyecto.
- config.php – Es el archivo principal de configuración. DeberÃa almacenar las programaciones más importantes del sitio.
- library – La locación central de todas las librerÃas personales y de terceros.
- templates – Los componentes reutilizables que forman tu diseño.
El archivo Config
Como desarrolladores y diseñadores nuestra meta principal es reducir el trabajo al mÃnimo. Una forma de lograrlo es mediante archivos config. Para tener una idea de cómo deberÃa lucir un archivo de configuración, mira el ejemplo que sigue:
<?php
/*
The important thing to realize is that the config file should be included in every
page of your project, or at least any page you want access to these settings.
This allows you to confidently use these settings throughout a project because
if something changes such as your database credentials, or a path to a specific resource,
you’ll only need to update it here.
*/$config = array(
“db” => array(
“db1” => array(
“dbname” => “database1”,
“username” => “dbUser”,
“password” => “pa$$”,
“host” => “localhost”
),
“db2” => array(
“dbname” => “database2”,
“username” => “dbUser”,
“password” => “pa$$”,
“host” => “localhost”
)
),
“urls” => array(
“baseUrl” => “http://example.com”
),
“paths” => array(
“resources” => “/path/to/resources”,
“images” => array(
“content” => $_SERVER[“DOCUMENT_ROOT”] . “/images/content”,
“layout” => $_SERVER[“DOCUMENT_ROOT”] . “/images/layout”
)
)
);/*
I will usually place the following in a bootstrap file or some type of environment
setup file (code that is run at the start of every page request), but they work
just as well in your config file if it’s in php (some alternatives to php are xml or ini files).
*//*
Creating constants for heavily used paths makes things a lot easier.
ex. require_once(LIBRARY_PATH . “Paginator.php”)
*/
defined(“LIBRARY_PATH”)
or define(“LIBRARY_PATH”, realpath(dirname(__FILE__) . ‘/library’));defined(“TEMPLATES_PATH”)
or define(“TEMPLATES_PATH”, realpath(dirname(__FILE__) . ‘/templates’));/*
Error reporting.
*/
ini_set(“error_reporting”, “true”);
error_reporting(E_ALL|E_STRCT);?>
Ése es un archivo config drop-in simple. Una serie multi-dimensional sirve como una estructura flexible para acceder a varios Ãtems del archivo config tales como credenciales de la base de datos.
- db – Almacena credenciales de base de dato u otra información perteneciente a nuestra base de datos.
- paths – Caminos comunmente usados a varios recursos de tu sitio.
- Archivos log
- Directorios de carga
- Recursos
- urls – Almacenar URLs puede ser muy útil al referenciar recursos remotos a través de tu sitio.
- emails – Almacena emails de admin o debuggeo para utilizar al manejar errores o formularios de contacto.
Utilizar constantes para aquellos caminos que son más utilizados hace que incluir declaraciones (require o include) sea rapidÃsimo y si el camino alguna vez cambia, sólo deberás actualizarlo en un lugar.
Utilizando diferentes archivos config para distintos entornos
Al utilizar diferentes archivos config para distintos entornos puedes programar propiedades relevantes dependiendo de cada uno. Esto quiere decir que si utilizas diferentes credenciales de base de datos, o diferentes caminos, para cada entorno, programando el archivo config respectivo te asegurará que tu código funcionará a la perfección al actualizar tu sitio en vivo. Esto también te permite obtener diferentes reportes de error basado en cada entorno. Pero recuerda nunca jamás mostrar los errores en tu sitio en vivo, ya que hacer esto puede exponer información importante y privada a los usuarios.
El diseño
Los template reutilizables son grandes salvadores de tiempo. Existen magnÃficas librerÃas para realizar templates (tal como Smarty). Éstas ofrecen una gran cantidad de funcionalidades. Pero como éste es un sitio simple, no nos tomaremos demasiado tiempo en programar la librerÃa y utilizaremos el template más básico. Logramos esto incorporando secciones comunes o módulos en nuestras páginas del sitio, de esta forma, si deseamos cambiar algo en la cabecera, se propagará a todo el sitio.
header.php
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01//EN”
“http://www.w3.org/TR/html4/strict.dtd”><html lang=”en”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>Simple Site</title>
</head><body>
<div id=”header”>
<h1>Simple Site</h1>
<ul class=”nav global”>
<li><a href=”#”>Home</a></li>
<li><a href=”#”>Articles</a></li>
<li><a href=”#”>Portfolio</a></li>
</ul></div>
rightPanel.php
<div id=”siteControls”>
<ul class=”categories”>
<li>PHP</li>
<li>HTML</li>
<li>CSS</li>
</ul>
<div class=”ads”>
<!– ads code –>
</div></div>
footer.php
<div id=”footer”>
Footer content…
</div>
</body>
</html>
index.php
Digamos que ya pusimos todos los elementos del diseño (cabecera, pie de página, panel derecho) en nuestro directorio de recursos como templates.
<?php
// load up your config file
require_once(“/path/to/resources/config.php”);require_once(TEMPLATES_PATH . “/header.php”);
?>
<div id=”container”>
<div id=”content”>
<!– content –>
</div>
<?php
require_once(TEMPLATES_PATH . “/rightPanel.php”);
?>
</div>
<?php
require_once(TEMPLATES_PATH . “/footer.php”);
?>
Avanzando un poco más
Si bien este sistema del template básico te permite tener un gran comienzo, puedes llevarlo mucho más lejos. Por ejemplo, puedes crear una clase o funciones que incluyan todos los archivos de template y aceptar un archivo de contenido como un argumento para que dibuje dentro del diseño. De esta forma no necesitas seguir incluyendo los archivos de template en cada página de tu sitio. Aquà tienen un rápido ejemplo:
/resources/library/templateFunctions.php
<?php
require_once(realpath(dirname(__FILE__) . “/../config.php”));function renderLayoutWithContentFile($contentFile, $variables = array())
{
$contentFileFullPath = TEMPLATES_PATH . “/” . $contentFile;// making sure passed in variables are in scope of the template
// each key in the $variables array will become a variable
if (count($variables) > 0) {
foreach ($variables as $key => $value) {
if (strlen($key) > 0) {
${$key} = $value;
}
}
}require_once(TEMPLATES_PATH . “/header.php”);
echo “<div id=\”container\”>\n”
. “\t<div id=\”content\”>\n”;if (file_exists($contentFileFullPath)) {
require_once($contentFileFullPath);
} else {
/*
If the file isn’t found the error can be handled in lots of ways.
In this case we will just include an error template.
*/
require_once(TEMPLATES_PATH . “/error.php”);
}// close content div
echo “\t</div>\n”;require_once(TEMPLATES_PATH . “/rightPanel.php”);
// close container div
echo “</div>\n”;require_once(TEMPLATES_PATH . “/footer.php”);
}
?>
index.php
Esto es asumiendo que en tu directorio de templates tengas un archivo llamado home.php que actúa como template contenedor.
<?php
require_once(realpath(dirname(__FILE__) . “/../resources/config.php”));
require_once(LIBRARY_PATH . “/templateFunctions.php”);
/*
Now you can handle all your php logic outside of the template
file which makes for very clean code!
*/$setInIndexDotPhp = “Hey! I was set in the index.php file.”;
// Must pass in variables (as an array) to use in template
$variables = array(
‘setInIndexDotPhp’ => $setInIndexDotPhp
);renderLayoutWithContentFile(“home.php”, $variables);
?>
home.php
<!– Homepage content –>
<h2>Home Page</h2><?php
/*
Any variables passed in through the variables parameter in our renderLayoutWithContentPage() function
are available in here.
*/echo $setInIndexDotPhp;
?>
Beneficios que incluye este método:
- Mejor separación de lógica y vista (php and html). Esta separación permite un código más limpio y nuestro trabajo como desarrolladores/diseñadores se vuelve mucho más fácil.
- Encapsular la lógica del template en una función nos permite realizar cambios en cómo rinde el template sin tener que actualizarlo en cada página de nuestro sitio.
Symlinks
En los sistemas basado en Unix (OS X, Linux) existe una funcionalidad genial llamada Symlinks (Symbolic Links). Los symlinks son referencias a directorios o archivos del filesystem. Esto es muy bueno cuando tenemos un recurso compartido, como por ejemplo una librerÃa que utilizamos en múltiples proyectos. Estas son algunas de las cosas que se puede lograr con los symlinks:
- Tener dos versiones de tu directorio de recursos. Al actualizar tu servidor vivo podrás subir tus últimos archivos en un directorio arbitrario. Simplemente apunta el symlink a este nuevo directorio, actualizándo automáticamente tu código base.
- Los recursos compartidos se manejan fácilmente con los symlinks.
Symlinks vs Hardlinks
Symlinks, o softlinks, actuán como referencias de caminos completos en el filesystem. Puedes utilizar symlinks en múltiples locaciones y el filesystem los trata como si fueran el propio archivo o el directorio que referencian. Hardlinks, por su parte, apuntan a un archivo del disco (piensa en los atajos de windows); te llevan a la verdadera locación del archivo.
Al usar symlinks debes fijarte que la configuración de tu servidor esté programada para seguirlos. Para Apache esto se hace en el archivo httpd.conf . Encuentra el bloque de directorio y asegúrate que la opción FollowSymLinks esté ahÃ. De lo contrario, añádela y reinicia Apache.
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
Creando Symlinks en OS X
Existen dos formas de crear symlinks en OS X:
- Por medio de la lÃnea de comando, navega (utilizando “cd, change directory”) hasta el directorio en el que deseas que el symlink sea creado, luego utiliza el siguiente comando:
$: ln -s /path/to/actual/dir targetDir
Por lo que si nuestra librerÃa de costumbre se alberga en ~/Sites/libraries/myCustomLibrary haremos cd hasta donde deseamos utilizar esta librerÃa cd ~/Sites/mySite/resources/library e ingresamos:
$: ln -s ~/Sites/libraries/myCustomLibrary myCustomLibrary
Nota: Este método deberÃa funcionar en todos los sistemas operativos que se basan en Unix.
Otra alternativa es a través del buscador. Manteniendo presionado Alt + Cmd mientras hacemos clic y arrastramos un archivo, a Symlink (o alias en OS X) que apunta al archivo será creado.
Creando Symlinks en Windows
Para lograr esto en Windows necesitarás utilizar el comando mklink en el Prompt Command:
C:\mklink /D C:\libraries\myCustomLibrary C:\Users\derek\Sites\mySite\resources\library\myCustomLibrary
En Resumen
Estos consejos son para principiantes o aquellas personas que se encuentran creando sitios simples o aplicaciones. Para los que deseen realizar aplicaciones o sitios más complejos les resultará útil considerar algo más avanzado como la arquitectura MVC y Object Oriented programming. Esperemos, de todas formas, que encuentren útiles estos consejos cuando comiencen su próximo proyecto PHP.
Fuente: Net Tuts
Miércoles, 5 de agosto de 2009 a las 11.33
Hay algunos elementos que se pueden adoptar y aplicar, es una buena forma de dejar el método de programar desorganizado de difÃcil escalamiento y calidad. Donde el mantenimiento se vuelve es un trabajo complejo.
Lo importante de esta estructura planteada es la idea y entender el concepto, no solo copiarla y aplicarla en los proyectos.
Jueves, 13 de agosto de 2009 a las 12.07
Muchas gracias. Me sirvió mucho.
Lunes, 1 de marzo de 2010 a las 15.15
Buenas tardes, cómo puedo hacer enlaces simbólicos a un recurso de red compartido en windows XP? He probado Junction y NTFS Links y no me ha sido posible, sólo acrúan de manera local. Muchas gracias.
Viernes, 10 de diciembre de 2010 a las 17.08
Si no te importa, podrÃas explicarme brevemente que es lo que haces con “templateFunctions.php”, esk a partir de ahà me pierdo un poquillo con lo que se consigue con eso.
Muchas gracias por tus tutoriales! estan de lujo ;D
Jueves, 24 de noviembre de 2011 a las 16.18
recuerdo que dreamweaver3 tenÃa una opción para mostrar un organigrama de los archivos de la página que estaba trabajando, ahora no encuentro esa opción.
hay alguna forma de poder ver los archivos de esta forma?, como un organigrama, osea que muestre que archivo se ejecuta primero, luego el segundos y asà sucesivamente ???
Jueves, 29 de diciembre de 2011 a las 01.48
muy buena explicacion, se entienden muy bien lo forma de organizar el contenido de una aplicacion
Jueves, 22 de agosto de 2013 a las 12.12
Tiene algun nombre formal, esta forma de organizar archivos? …
Miércoles, 5 de agosto de 2015 a las 09.56
MIcaela
He cambiado el hosting a otro proveedor (arsys.es) y subido los ficheros del backup de mi web, pero soy incapaz de ordenarlos de manera que se visualice la web (soy financiero y tengo muy poca idea de estos temas) ¿Sabes a quién puedo recurrir-pagando por supuesto- para que me resuelva el problema? Mi web está en word-press
Muchas gracias
Javier