Micaela 5 de agosto de 2009 a las 09.06
   Imprimir artículo
elWebmaster.com

Cómo organizar tu proyecto PHP de la mejor manera


phpelefante12Al 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


Enviar a Del.icio.us Enviar a Meneame Enviar a Digg Enviar a Fresqui Enviar a Enchilame

Comentarios (8)

  1. Jorge Eduardo Olaya Perdomo dice:

    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.

  2. Mariano dice:

    Muchas gracias. Me sirvió mucho.

  3. Oscar dice:

    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.

  4. Jes√ļs dice:

    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

  5. cubasdc dice:

    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 ???

  6. jhoweb dice:

    muy buena explicacion, se entienden muy bien lo forma de organizar el contenido de una aplicacion

  7. Juan dice:

    Tiene algun nombre formal, esta forma de organizar archivos? …

  8. javier s√°nchez verdasco dice:

    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

Deja tu opinión

© 2007 - 2008 elWebmaster.com | Powered by Wordpress | Diseño CSS y XHTML válido. | Algunos íconos basados en FamFamFam Mini
Acceder