1. Code
  2. PHP

Organice su Próximo Proyecto PHP en la Forma Correcta

Scroll to top
10 min read

Spanish (Español) translation by Rodney Martinez (you can also view the original English article)

Cuando comienza con PHP, puede ser desalentador darse cuenta cuál es la mejor forma de organizar un proyecto. Si algunas vez ha estado confundido con respecto a dónde poner sus imágenes, bibliotecas externas, o conservar la información lógica separada de su composición, entonces revise estos consejos; ya que lo pondrán en la dirección correcta.

Detalles del Tutorial

  • Programa: PHP/Proyectos
  • Versión: 1
  • Dificultad: Fácil
  • Tiempo Estimado para la Realización: 20 mínutos 

Estructura del Directorio

Me gustaría decir que la cosa número para poner su proyecto en funcionamiento rápidamente es tener una estructura de directorio sólida y que usted puede volver a usar para múltiples proyectos. Si usted está usando un framework, por lo general, éste ofrecerá una estructura para usarlo, pero en este escenario vamos a trabajar en un sitio web sencillo.

Desglose

  • Es muy probable que ya esté muy familiarizado con la estructura public_html. Esta es la Raíz del Documento en la cual todos sus archivos públicos pueden tener acceso (/public_html/page.php accede a example.com/page.php).

    • img — Todos sus archivos de imágenes. He decidido dividir las imágenes de contenido de las imágenes del diseño.
    • css — Todos sus archivos CSS.
    • js — Todos sus archivos javascript.
  • El directorio resources deberá de contener todas las bibliotecas de terceros, bibliotecas personalizadas, archivos de configuración y cualquier otro código que actué como un recurso en su proyecto.

    • config.php — El archivo de configuración principal. Deberá almacenar la configuración del sitio.
    • library — Ubicación central para todos las bibliotecas personalizadas.
    • templates — Componentes reusables que conforman su composición.

El Archivo de Configuración

Como diseñadores y desarrolladores, nuestro objetivo principal es hacer tan poco trabajo como sea posible. Un camino para alcanzar este objetivo es con los archivos config. Para tener una mejor idea de lo que un archivo de configuración deberá tener, entonces revise el siguiente ejemplo.

1
<?php
2
3
/*

4
  The important thing to realize is that the config file should be included in every

5
	page of your project, or at least any page you want access to these settings.

6
	This allows you to confidently use these settings throughout a project because

7
	if something changes such as your database credentials, or a path to a specific resource,

8
	you'll only need to update it here.

9
*/
10
11
$config = array(
12
	"db" => array(
13
		"db1" => array(
14
			"dbname" => "database1",
15
			"username" => "dbUser",
16
			"password" => "pa$$",
17
			"host" => "localhost"
18
		),
19
		"db2" => array(
20
			"dbname" => "database2",
21
			"username" => "dbUser",
22
			"password" => "pa$$",
23
			"host" => "localhost"
24
		)
25
	),
26
	"urls" => array(
27
		"baseUrl" => "http://example.com"
28
	),
29
	"paths" => array(
30
		"resources" => "/path/to/resources",
31
		"images" => array(
32
			"content" => $_SERVER["DOCUMENT_ROOT"] . "/images/content",
33
			"layout" => $_SERVER["DOCUMENT_ROOT"] . "/images/layout"
34
		)
35
	)
36
);
37
38
/*

39
	I will usually place the following in a bootstrap file or some type of environment

40
	setup file (code that is run at the start of every page request), but they work 

41
	just as well in your config file if it's in php (some alternatives to php are xml or ini files).

42
*/
43
44
/*

45
	Creating constants for heavily used paths makes things a lot easier.

46
	ex. require_once(LIBRARY_PATH . "Paginator.php")

47
*/
48
defined("LIBRARY_PATH")
49
	or define("LIBRARY_PATH", realpath(dirname(__FILE__) . '/library'));
50
	
51
defined("TEMPLATES_PATH")
52
	or define("TEMPLATES_PATH", realpath(dirname(__FILE__) . '/templates'));
53
54
/*

55
	Error reporting.

56
*/
57
ini_set("error_reporting", "true");
58
error_reporting(E_ALL|E_STRCT);
59
60
?>

Este es un archivo de configuración básico. Un arreglo múlti-dimensional sirve como una estructura flexible para acceder a varios objetos de config tales como las credenciales de la base de datos.

  • db — Almacena las credenciales de la base de datos u otros datos pertinentes para sus bases de datos.
  • paths — Frecuentemente usa rutas a varios recursos para su sitio.
    • archivos de registro
    • directorios para cargar archivos
    • recursos
  • urls — Almacena las urls que pueden ser útiles cuando hacen referencia a recursos remotos a través de su sitio.
  • emails — Almacena la depuración o correos admin para usar cuando maneje errores o en formularios de contacto.

Usando constantes para rutas de uso común hace que incluir declaraciones (require o include) sea un soplo, y si la ruta alguna vez cambia, entonces usted solamente necesitará actualizarla en un lugar.

Usando diferentes Archivos de Configuración para Múltiples Ambientes

Al usar diferentes archivos de configuración para diferentes ambientes, usted puede tener configuraciones relevantes dependiendo del ambiente actual. Lo que significa que si usted usa diferentes credenciales de bases de datos o diferentes rutas para cada ambiente, al configurar los respectivos archivos de configuración, usted asegurará que su código funcione sin problemas cuando esté actualizando su sitio web en tiempo real. Esto también le permite tener diferentes configuraciones de reportes de error basado en el ambiente actual. ¡Nunca muestra errores en su sitio web en vivo! Mostrando errores en el sitio web en vivo podría exponer datos sensitivos a usuarios (tales como las contraseñas).

El diseño

Plantillas reusables son otro enorme ahorrador de tiempo. Hay algunas bibliotecas magníficas para las plantillas (tales como Smarty) y siempre animo a usar este tipo de biblioteca en lugar de reinventar la rueda. Estas bibliotecas ofrecen mucha funcionalidad (como los métodos auxiliares para formato de moneda y ofuscando direcciones de correo electrónico). Ya que esto es un sitio sencillo, sin embargo, no queremos ocupar el tiempo en configurar la biblioteca, sino que estaremos usando los conceptos más básicos de las plantillas básicas. Conseguiremos estos incluyendo secciones comunes o módulos para nuestras páginas del sitio, de esta manera, si queremos cambiar algo en el header, encabezado, como añadir un enlace a la navegación global, éste cambio será reproducido a través de todo el sitio web.

header.php

1
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"

2
   "http://www.w3.org/TR/html4/strict.dtd">
3
4
<html lang="en">
5
<head>
6
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
7
	<title>Simple Site</title>
8
</head>
9
10
<body>
11
<div id="header">
12
	<h1>Simple Site</h1>
13
	<ul class="nav global">
14
		<li><a href="#">Home</a></li>
15
		<li><a href="#">Articles</a></li>
16
		<li><a href="#">Portfolio</a></li>
17
	</ul>
18
19
</div>

rightPanel.php

1
<div id="siteControls">
2
	<ul class="categories">
3
		<li>PHP</li>
4
		<li>HTML</li>
5
		<li>CSS</li>
6
	</ul>
7
	<div class="ads">
8
		<!-- ads code -->
9
	</div>
10
11
</div>

footer.php

1
<div id="footer">
2
	Footer content...
3
</div>
4
</body>
5
</html>

index.php

Digamos que elaboramos todos los componentes para nuestra composición (header, footer, rightPanel) en nuestro recurso de directorio debajo de plantillas.

1
<?php	
2
	// load up your config file

3
	require_once("/path/to/resources/config.php");
4
	
5
	require_once(TEMPLATES_PATH . "/header.php");
6
?>
7
<div id="container">
8
	<div id="content">
9
		<!-- content -->
10
	</div>
11
	<?php
12
		require_once(TEMPLATES_PATH . "/rightPanel.php");
13
	?>
14
</div>
15
<?php
16
	require_once(TEMPLATES_PATH . "/footer.php");
17
?>

Yendo más lejos.

Aunque éste sistema de plantilla básica lo lleva a un gran comienzo, usted aún puede ir más lejos. Por ejemplo, usted puede crear una clase o funciones que incluyen todos los archivos de las plantillas y aceptan un archivo de contenido como un argumento para renderizarlo dentro de la composición. De esta manera usted no necesita continuar incluyendo los archivos de la plantilla en cada página de su sitio web, pero en lugar de abstracto que lógico lo que significa menos trabajo en el camino. Le mostraré un ejemplo rápido.

/resources/library/templateFunctions.php

1
<?php
2
	require_once(realpath(dirname(__FILE__) . "/../config.php"));
3
4
	function renderLayoutWithContentFile($contentFile, $variables = array())
5
	{
6
		$contentFileFullPath = TEMPLATES_PATH . "/" . $contentFile;
7
	
8
		// making sure passed in variables are in scope of the template

9
		// each key in the $variables array will become a variable

10
		if (count($variables) > 0) {
11
			foreach ($variables as $key => $value) {
12
				if (strlen($key) > 0) {
13
					${$key} = $value;
14
				}
15
			}
16
		}
17
	
18
		require_once(TEMPLATES_PATH . "/header.php");
19
	
20
		echo "<div id=\"container\">\n"
21
		   . "\t<div id=\"content\">\n";
22
	
23
		if (file_exists($contentFileFullPath)) {
24
			require_once($contentFileFullPath);
25
		} else {
26
			/*

27
				If the file isn't found the error can be handled in lots of ways.

28
				In this case we will just include an error template.

29
			*/
30
			require_once(TEMPLATES_PATH . "/error.php");
31
		}
32
	
33
		// close content div

34
		echo "\t</div>\n";
35
	
36
		require_once(TEMPLATES_PATH . "/rightPanel.php");
37
	
38
		// close container div

39
		echo "</div>\n";
40
	
41
		require_once(TEMPLATES_PATH . "/footer.php");
42
	}
43
?>

index.php

Esto es suponiendo que usted tiene un archivo llamado home.php en su directorio de plantillas que actúa como una plantilla de contenido.

1
<?php
2
3
	require_once(realpath(dirname(__FILE__) . "/../resources/config.php"));
4
5
	require_once(LIBRARY_PATH . "/templateFunctions.php");
6
7
	/*

8
		Now you can handle all your php logic outside of the template

9
		file which makes for very clean code!

10
	*/
11
	
12
	$setInIndexDotPhp = "Hey! I was set in the index.php file.";
13
	
14
	// Must pass in variables (as an array) to use in template

15
	$variables = array(
16
		'setInIndexDotPhp' => $setInIndexDotPhp
17
	);
18
	
19
	renderLayoutWithContentFile("home.php", $variables);
20
21
?>

home.php

1
<!-- Homepage content -->
2
<h2>Home Page</h2>
3
4
<?php
5
6
	/*

7
		Any variables passed in through the variables parameter in our renderLayoutWithContentPage() function

8
		are available in here.

9
	*/
10
11
	echo $setInIndexDotPhp;
12
13
?>

Los Beneficios de éste Método incluyen:

  • Mayor separación de lógica y vista (php y html). Separando problemas como esto hace un código más limpio, y el trabajo de los diseñadores o desarrolladores se vuelve más fácil debido a que ellos trabajan en su mayoría con sus respectivos códigos.

  • Encapsulando la plantilla logic en una función le permite hacer cambios para calcular cómo la plantilla renderiza sin actualizarlo en cada página de su sitio.

Symlinks

Un sistema basado en Unix (os x, linux) hay una pequeña funcionalidad estupenda llamada symlinks (Symbolic Links). Symlinks son referencias a directorios actuales o archivos en los archivos de sistemas. Esto es magnífico para cuando usted tiene un recurso compartido, tales como; una biblioteca usada entre múltiples proyectos. Aquí hay algunas cosas concretas que usted puede hacer con symlinks:

  • Tiene dos versiones de su directorio de recursos. Cuando actualiza su servidor en vivo, usted puede actualizar sus últimos archivos en un directorio arbitrario. Simplemente señale el symlink a este nuevo directorio e instantáneamente actualizará su código base. Si algo sale mal, puede retroceder instantáneamente al directorio anterior (el que estaba trabajando).

  • Comparte recursos que son fácilmente manejados con symlinks. Digamos que usted tiene una biblioteca personalizada en la que ha estado trabajando, cualquier actualización para la biblioteca que usted haga en un proyecto estará disponible, inmediatamente en otra.

Usando Symlinks

Symlinks versus Hardlinks

Symlinks, o softlinks, actúan como referencias a rutas completas en los archivos de sistemas. Usted puede usar symlinks en múltiples ubicaciones y los hilos de los archivos de sistemas como si fueran el archivo actual o directorio de referencia de ellos. Los hardlinks, por otra parte, son punteros hacia un archivo en el disco (considérelos como atajos en windows), ellos lo llevarán a la ubicación actual del archivo.

Hay algunas cosas que usted deberá de considerar cuando esté usando symlinks. La configuración de su servidor debe estar ajustada para seguir symlinks. Para el servidor Apache esto está hecho en el archivo httpd.conf. Encuentre el bloque Directory y asegúrese de que Optiones FollowSymlinks está ahí. Si no está, entonces agréguela y luego, reinicie el servidor Apache.

1
<Directory />
2
	Options FollowSymLinks
3
	AllowOverride None
4
</Directory>

Creando Symlinks en OS X

Hay dos maneras de crear symlinks en OS X:

  • A través de la línea de comando (cd, cambiar directorio) para el directorio en el cual usted quiere que symlink sea creado, luego use el siguiente comando:

    1
    $: ln -s /path/to/actual/dir targetDir
    

    Pero si nuestro biblioteca personalizada vive en ~/Sites/libraries/myCustomLibrary cambiaríamos cd hacia donde quisiéramos usar esa biblioteca cd ~/Sites/mySite/resources/library e introducir:

    1
    $: ln -s ~/Sites/libraries/myCustomLibrary myCustomLibrary
    

    Observe que este método debería de funcionar en todos los sistemas operativos basados en Unix.

  • La otra alternativa es a través del finder. Al mantener pulsada la tecla ALT + cmd mientras hace clic y arrastre un archivo, un Symlink (o alias en os x) que señala a el archivo que está creado.

Creando Symlinks en Windows

Para lograr esto en windows, necesitará usar el comando mklink en el comando prompt:

1
2
C:\mklink /D C:\libraries\myCustomLibrary C:\Users\derek\Sites\mySite\resources\library\myCustomLibrary

Resumen

Estos consejos se entiende que son para principiantes o para esos que crean sitios web o aplicaciones sencillas.  Son ideales para grandes aplicaciones o sitios, usted querrá considerar algo más avanzado como la arquitectura MVC y la programación orientada a objetos. Lo animo a examinar estos una vez que haya conseguido que sus pies se mojen y sientan que superado la mayoría de los pasos anteriores. He decidido no abordar las fuentes de control, ya que es un tema bastante largo por sí mismo, pero estos consejos deberían ser suficientes para ayudarle en la organización de los archivos para un control de la fuente más fácil si lo desea (sugerencia: almacene cosas como las imágenes de la composición en su directorio de recursos y los symlinks en el directorio /public_html/img). Definitivamente, estudie el uso de las fuentes de control, como subversion o git para todos sus proyectos.

Espero que encuentre estos consejos útiles cuando empiece con su próximo proyecto PHP. ¡Gracias!

Recursos

  • Síguenos en Twitter, o suscribase a NETTUTS RSS Feed para más artículos y tutoriales de desarrollo web diarios.