Foros del Web » Programando para Internet » PHP »

PHP5: Diseño en 3 capas y problemas con subdirectorios

Estas en el tema de PHP5: Diseño en 3 capas y problemas con subdirectorios en el foro de PHP en Foros del Web. Conceptualmente, si separo en 3 capas un sistema, debo colocar cada capa en un subdirectorio. En tecnologías como .Net o Java, cuando se crea un ...
  #1 (permalink)  
Antiguo 26/03/2006, 12:42
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 10 meses
Puntos: 32
PHP5: Diseño en 3 capas y problemas con subdirectorios

Conceptualmente, si separo en 3 capas un sistema, debo colocar cada capa en un subdirectorio.

En tecnologías como .Net o Java, cuando se crea un "paquete", se hace referencias por código al mismo paquete, tanto para definir una clase como parte del paquete, como para usar parte del contenido del paquete (no tienes que hacer referencias a la ubicación física de los archivos).

En la beta de PHP5 se hablaba de "namespace", idem a la sintaxis de .Net para los "paquetes", pero en la versión final se eliminó porque no estaba pronto (se presume que en la versión 6 aparecerá implementado).

¿A donde voy con todo esto? A un problema de manejo de directorios

Mi pregunta es: ¿como manejar de forma limpia (hasta que esto no este solucionado por lenguaje) las llamadas a contenidos entre subdirectorios, como si de paquetes estuviéramos hablando?

Cuando digo "limpia", quiero decir, no hacer referencias del tipo "absoluta", donde todo nuestro sistema quedará "hardcode" a los directorios, o las "relativas" pero que tendrán problemas cada vez que son invocadas de lugares distintos.

Una solución que he llegado a hacer (sin hacer un "sitio modular") es que exista un archivo configuración.php con referencias a todos los subdirectorios del sistema en variables de sesión, y estas son usadas por todo el sistema. El problema es que siempre hay que incluir este archivo y de forma "absoluta" (el gran dilema del "huevo o la gallina").

Otra solución teórica que veo a esto es crear variables de ambientes (tal vez del lado del servidor) que contengan todas estas referencias y que cuando se ejecutan las aplicaciones no necesiten incluir ningún otro fuente, solo hacer referencia a las variables (una mejora del caso anterior).

Lo lamentable de todo esto, es que en la versión 6 este tipo de problemas debería estar resuelto con el uso de "namespace".

¿Cual es vuestra experiencia? ¿consejos? ¿ideas? ¿cómo han resuelto este tipo de problemas?
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #2 (permalink)  
Antiguo 26/03/2006, 19:30
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 18 años, 1 mes
Puntos: 0
yo lo ke utilizo es una direccion absoluta/relativa..., funciona desde el directorio pricipal de mi aplicacion ( independiente del archivo raiz del director) ,incluyendo archivos haciendo la web modular ,es relativa al servidor, pero absoluta hacia dentro de mi aplicacion , espero ke kuando lo termine sea un CMS ...saludos
  #3 (permalink)  
Antiguo 27/03/2006, 10:16
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
En PHP no sé si conoces .. pero tienes la variable de servidor:

$_SERVER['DOCUMENT_ROOT'] .. eso te dará el "raiz" de tu sitio en ese servidor .. así que la puedes usar tal cual para definir desde ahí (desde ese punto) tu extructura y si cambias de servidor .. te dará exactamente igual, no tendras ni que configurar nada.

Ahora .. si eso a su vez lo conviertes en una constante .. ya es cosa tuya. Siempre puedes acceder a esa variable en forma completamente global (incluso dentro de tus métodos de tus objetos si lo deseas o funciones en general).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 27/03/2006, 10:40
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 10 meses
Puntos: 32
Un ejemplo de la solución que uso actualmente ...

Si, la solución "parche" que he hecho al momento se basa en el "document_root", pero el tema es que (como decía en la parte de "el huevo o la gallina") en algún momento debes hacer uso de una referencia "inicial", lo cual deberás repetir en absolutamente todos los fuentes de tu sistema.

Un ejemplo práctico:

1) Me creo un archivo "configuracion.php" donde defino todas la información que necesito para posicionarme en cada "capa" del sistema; en este caso decidí que lo más efectivo era crear variables de sesión. Este sería su contenido:

$_SESSION['HOME']= $_SERVER[DOCUMENT_ROOT];

$_SESSION['APLICA']= $_SERVER[DOCUMENT_ROOT]."/nombre_aplicacion";



$_SESSION['DOM']= $_SESSION['APLICA']."/Dominio";

$_SESSION['PRE']= $_SESSION['APLICA']."/Presentacion";

$_SESSION['PER']= $_SESSION['APLICA']."/Persistencia";

2) Pero para que esto funcione y esté disponible para todos los fuentes, debo incluir el "configuracion.php". Y para eso, necesito volver a llamar al "document_root":

/* CONFIGURACION INICIAL */

session_start();

$aplicacion = $_SERVER[DOCUMENT_ROOT]."/nombre_aplicacion";

require_once ($aplicacion."/configuracion.php");



/* CARGA DE CLASES */

require_once($_SESSION['PRE'].'\Template.class.php');



¿Se entiende la idea de esta solución?

Me molesta bastante tener que estar obligado a hacer estas "3 líneas obligatorias" para poder hacer uso de esta solución. Pensaba que tal vez podría definir las variables en el servidor sin tener que depender de una sesión ni de una llamada al archivo de configuración.

Como decía en el correo original, esto debería estar solucionado con el uso de "namespaces", pero me gustaría conocer otras experiencias u otras opiniones al respecto de este "problema".

¿O me dirán que no usan subdirectorios, o que tienen "hardcode" las referencias a los directorios?
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #5 (permalink)  
Antiguo 27/03/2006, 11:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Realmente no sé para que usas variables de sesión ..

Tus datos son "constantes" .. deberías hacer tu "include()" correspondiente y ahorrar un recurso "valioso" que es una sesión (variables de.)

Cita:
Me molesta bastante tener que estar obligado a hacer estas "3 líneas obligatorias" para poder hacer uso de esta solución. Pensaba que tal vez podría definir las variables en el servidor sin tener que depender de una sesión ni de una llamada al archivo de configuración.
Bueno .. sobre gustos no hay nada escrito .. a mi realmente no me "molesta" en absoluto hacer un "include()" para mis "config.inc.php" .. De hecho esto me hace independiente del servidor que corra mi aplicación.

Creo que tu concepto de "namespaces" no es aplicable en este caso (es cierto que no soy el más indicado para decir esto, pero mé dá esa impresión) .. Estás empleando un término que es de "programación orientada a objetos" cuando tu problema es más básico:

"¿como incluir un archivo por defecto en todos mis scritps PHP?".

Esto tiene solución .. no muy "práctica" tal vez pues depende de configuración de PHP (la cual podrías ajustar por un .htaccess o similar). Se trata de usar la directiva:

auto_append_file = nombre_archivo.tal

En principio se configura por tu php.ini y afectaría a toda aplicación de tu servidor y scritp que PHP abra (a no ser que trabajes la configuración de PHP como "CGI" y no como "módulo").

Revisa como puedes alterar esa configuración:
http://www.php.net/manual/en/ini.php#ini.list

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 27/03/2006, 12:01
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 10 meses
Puntos: 32
Cita:
Iniciado por Cluster
Realmente no sé para que usas variables de sesión ..
Tus datos son "constantes" .. deberías hacer tu "include()" correspondiente y ahorrar un recurso "valioso" que es una sesión (variables de.)
Es un "prototipo" ... en primera instancia estaba tratando de evitar hacer includes en todos los archivos y ver de agregar variables en el servidor. A los efectos la funcionalidad es la misma quitando la sesión y dejar solo la llamada al archivo de configuración y luego a constantes.

Cita:
Iniciado por Cluster
Bueno .. sobre gustos no hay nada escrito .. a mi realmente no me "molesta" en absoluto hacer un "include()" para mis "config.inc.php" .. De hecho esto me hace independiente del servidor que corra mi aplicación.
¿Y la primer llamada que haces? Algo del estilo:

include($_SERVER[DOCUMENT_ROOT]."/nombre_aplicacion/config.inc.php");

¿Y luego defines constantes para cada subdirectorio de tu sistema?

Cita:
Iniciado por Cluster
Creo que tu concepto de "namespaces" no es aplicable en este caso (es cierto que no soy el más indicado para decir esto, pero mé dá esa impresión) .. Estás empleando un término que es de "programación orientada a objetos" cuando tu problema es más básico:
Termina siendo el parche de un problema de "namespaces" que no provee el lenguaje PHP5. En sí cuento toda la experiencia para informar de donde vengo y hacia donde voy, pues en una de esas me pueden iluminar si estoy equivocando el camino.

Cita:
Iniciado por Cluster
auto_append_file = nombre_archivo.tal
Lo voy a probar. Tal vez pueda servir para armar un archivo de configuración que no necesite ser incluido en cada fuente de forma manual y repetitiva.

Gracias.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #7 (permalink)  
Antiguo 27/03/2006, 12:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
¿Y luego defines constantes para cada subdirectorio de tu sistema?
Llamo a los archivos externos que requiera por su ruta absoluta en el script que los necesite ..

Cita:
Termina siendo el parche de un problema de "namespaces" que no provee el lenguaje PHP5. En sí cuento toda la experiencia para informar de donde vengo y hacia donde voy, pues en una de esas me pueden iluminar si estoy equivocando el camino.
Ok, pero .. es lo que hay en PHP .. A veces es necesario "ubicarse" en el lenguaje que estás usando para no perdirle más de lo que se diseño, conocer sus limitaciones y si no te agrada siempre podrás usar otros lenguajes que si que soporten todo lo que requieras.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 27/03/2006, 13:10
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 10 meses
Puntos: 32
Cita:
Iniciado por Cluster
Llamo a los archivos externos que requiera por su ruta absoluta en el script que los necesite ..
No te entendí mucho, tal vez porque estoy tratando de analizar tu forma de trabajo desde el punto de vista del mio

¿Si tu quieres acceder a una clase que se encuentra ubicada en un subdirectorio de tu sistema, y tienes que hacer referencia al mismo para poder llegar a ella... como haces? (me puedes poner un ejemplo?)

Cita:
Iniciado por Cluster
Ok, pero .. es lo que hay en PHP .. A veces es necesario "ubicarse" en el lenguaje que estás usando para no perdirle más de lo que se diseño, conocer sus limitaciones y si no te agrada siempre podrás usar otros lenguajes que si que soporten todo lo que requieras.
No creo que lo que estoy tratando de hacer sea tan complicado, pero como ya lo comenté, se debe resolver con el propio lenguaje al incorporar el manejo de "paquetes".

Y no es invento mio , la versión beta de PHP5 incluye esta capacidad, pero en la versión final la sacaron porque no llegaron a tiempo para terminarla.

La implementación no debe ser tan trivial como parece.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #9 (permalink)  
Antiguo 27/03/2006, 14:16
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
¿Si tu quieres acceder a una clase que se encuentra ubicada en un subdirectorio de tu sistema, y tienes que hacer referencia al mismo para poder llegar a ella... como haces? (me puedes poner un ejemplo?)
Como te dije . .en el script que lo requiera:

include("/ruta/absoluta/classes/clase.php");

O con ayuda de $_SERVER['DOCUMENT_ROOT'] para evitar la parte superior de la ruta donde esté ubicado mi directorio "classes/" que podría ser donde la tuviera.

Cita:
No creo que lo que estoy tratando de hacer sea tan complicado, pero como ya lo comenté, se debe resolver con el propio lenguaje al incorporar el manejo de "paquetes".

Y no es invento mio , la versión beta de PHP5 incluye esta capacidad, pero en la versión final la sacaron porque no llegaron a tiempo para terminarla.

La implementación no debe ser tan trivial como parece.
OK, .. yo no conozco PHP 5 en profundidad .. así que por mi parte hasta aquí llego. Espera alguien que esté más interiorizado en PHP 5.

¿No será que buscas lo que llama la configuración de PHP: "include_path" donde incluyes los directorios que PHP buscará para llamar un script en general? .. Es lo que se usa por ejemplo para configurar PEAR y así referenciarte a un script (que contenga una classe o no .. es lo de menos) tan sólo con su nombre: classe.php?

Ahora .. que esta solución la veas como un "parche" o cumpla la filosofía de otros lenguajes y "paquetes" es otro tema (que ni entro ni salgo por qué desconozco).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 27/03/2006 a las 15:48
  #10 (permalink)  
Antiguo 02/04/2006, 19:12
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 10 meses
Puntos: 32
En base a todo lo discutido en esta charla, escribí el siguiente "post" en mi blog:
http://phpcinco.blogspot.com/2006/04...lemas-con.html

Espero que ahora quede más claro.

Cluster, gracias por tu tiempo.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #11 (permalink)  
Antiguo 18/04/2006, 11:29
ASL
 
Fecha de Ingreso: marzo-2006
Mensajes: 10
Antigüedad: 18 años
Puntos: 0
Muchisimas gracias a Enrique Place y a Cluster, la verdad que una respuesta más completa no puedo esperar
Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:39.