2009-09-07 12 views
24

Estoy creando un gran sitio basado en PHP MVC que tendrá una gran biblioteca de clases php, javascripts y muchos archivos css (sin mencionar una gran cantidad de archivos para el MVC).¿Cuál es la estructura de directorios basada en PHP más escalable para un sitio grande?

Por primera vez, me estoy tomando el tiempo para planificar una estructura de directorios organizada y limpia.

¿Qué estructuras de directorios usas habitualmente y cuáles serán más fáciles de manipular cuando haya miles de archivos?

+0

Esto es solo un pensamiento. ¿Has considerado usar un framework PHP MVC que ya existe, como CakePHP? Entiendo que puede haber una curva de aprendizaje, pero podría valer la pena considerar los beneficios de un marco popular de código abierto. Creé y mantuve mi propio código durante años, pero descubrí que es más escalable utilizar un marco de terceros, especialmente para sitios grandes. Tal vez descubra que le ahorrará tiempo a largo plazo y tendrá habilidades valiosas para futuros proyectos de subcontratación. – Dooltaz

+2

en realidad he pensado en eso ... y tal vez use uno al final ... pero tengo que ser capaz de hacerlo yo mismo antes de poder seguir adelante :) es algo neurótico ha – johnnietheblack

Respuesta

21

Esta es mi configuración. Me ha funcionado muy bien para proyectos pequeños, muy grandes (incluida una red social).todo
Estas carpetas vivirían dentro de mi carpeta principal de la aplicación:

  • config - contiene los archivos PHP personalizado de configuración
  • css - contiene archivos CSS del proyecto
  • ayudantes - Contiene 'ayudante' archivos (cada archivo es una colección de funciones)
  • imágenes - contiene las imágenes del proyecto
  • JS - contiene archivos Javascript del proyecto
  • lib - Contiene clases PHP específicas para el proyecto
  • módulos - Mi framework MVC permite secciones del sitio de embalaje como módulos
    • Blog - Un módulo de ejemplo
      • controladores - contiene los controladores para el módulo
      • modelos - contiene los modelos para el módulo
      • vistas - contiene las vistas para el módulo
  • vistas - contiene puntos de vista que deben ser accesibles a nivel mundial (encabezado de la página, pie de página, etc.)

Todos los directorios podrían contener, obviamente, subcarpetas que organizarían aún más sus archivos. Por ejemplo, la carpeta 'css' podría tener subcarpetas llamadas 'web' y 'mobile'. La carpeta 'images' podría contener una carpeta 'user_uploaded' que podría contener''profile '. Y, por supuesto, puede agregar carpetas como mejor le parezca, en un proyecto tengo una carpeta llamada 'cargadores' que solo contiene scripts de carga independientes.

También uso métodos de conveniencia que ayudan a construir los nombres de archivo de lo que quiero cargar. Por ejemplo, mi loadView() buscará el archivo de vista en el directorio actual del módulo, o si pasa un argumento $ opcional de módulo, se verá específicamente dentro de la carpeta de ese módulo.

Espero que esto ayude.

+2

Esto significa que todo el código php, la configuración, etc. estarán visibles para todos, a menos que haga algo de magia del servidor con algo como .htaccess – OIS

+1

OIS es correcto. En esta configuración, si alguien conocía el nombre del archivo, podrían llamarlo desde el navegador. Publiqué esta respuesta antes de cambiar a Symfony (que oculta todos los archivos de fondo) y definitivamente recomiendo mover todos los archivos no públicos fuera del acceso público a la web. –

+1

'lib - contiene clases de PHP específicas para el proyecto' ¿Quiere decir" no específico "aquí? Pensaría que lib es para cosas que escribes que son generales y/o para bibliotecas existentes que usas. Además, tengo curiosidad: ¿qué piensas sobre las carpetas 'js' y' css' en lo que respecta a los módulos? ¿Podrías dividir el directorio 'js' en lib & modules de una manera similar? –

5

Para archivos principales que se incluyen: AppRoot/inc/

para los datos de las funciones de acceso y las clases están en: AppRoot/DAO/

Para los javascript: AppRoot/scripts/

Por CSS: AppRoot/estilos/

para imágenes: AppRoot/img/

para el contenido estático (normalmente para las fotos de perfil de usuario o imágenes subidas): AppRoot/estáticos/

Para cachés: AppRoot/Caches/

Para las plantillas o ver archivos: AppRoot/templates/

Todas las páginas del archivo: AppRoot/

Estructura de Samstyle PHP Framework


La respuesta que publiqué aquí fue de 2009. Con los años se publicaron más estándares, incluido PSR-0, que cubre el tema sobre la estructura de carpetas. También tengo una estructura de carpetas nueva (y creo que es mejor) con Packfire Framework.

+0

¿por qué este? ser votado abajo? – johnnietheblack

+1

ni idea. Me encantaría saber de los votantes también. – mauris

+0

@mauris ¿todavía usas esta estructura? –

4

En mi experiencia, nunca puedes planear esto. Puedes intentar seguir lo que hacen los marcos, pero creo que nunca encajo exactamente en su molde.

Recomiendo mantener una buena regla general para 20 archivos en un directorio máximo. Si encuentra que necesita más, simplemente cree unos pocos subdirectorios y mueva los componentes comunes allí.

+0

idea genial para aprender de los marcos ... pero cuáles son algunos buenos, y dónde encuentro sus estructuras? ¡Gracias! – johnnietheblack

2

Uso codeigniter para proyectos pequeños y grandes. Su función MVC es moderadamente buena.

  • CodeIgniter \ system \ application \ config: contener todo tipo de archivos de configuración como DB, pasarela de pago, config ftp, rutas y ...
  • CodeIgniter \ system \ application \ models: contener todo tipo de base de datos clases, debe crear subcarpetas según su necesidad, utilicé clientes, mailData, paymentModel, informe, servicio web y ....
  • codeIgniter \ system \ application \ views: contiene todo tipo de archivos que funcionarán como salida para clientes, debe pensar en reutilizar estos archivos si es posible. Al igual que los modelos, debe crear una subcarpeta como administración, informes, correo electrónico, plantilla de correo electrónico .....
  • codeIgniter \ system \ application \ controllers: esta es la parte más importante. Esto ayudará a crear la URL de SEO, por lo que debe tener más cuidado con las subcarpetas esta vez. Puede crear administración similar, productos, informes, pedidos ... y considerar un buen nombre para las funciones de la clase de controlador.

Estos fueron para el archivo PHP/HTML.

Ahora sobre los otros archivos:

  • CodeIgniter \ imágenes: para las imágenes
  • CodeIgniter \ scripts: para los scripts de Java y su marco
  • CodeIgniter \ estilos: para el CSS
  • codeIgniter \ uploads: para los archivos cargados, si no desea colocar archivos en el DB

Para obtener más información, consulte el código Marco de encendedor en detalle.

aquí "CodeIgniter \" es el AppRoot

+0

¿Puedo poner index.php en la carpeta raíz web y el resto de PHP en el controlador? Gracias de antemano. –

18

Usted debe tener un directorio como root web, donde sólo los archivos que desea expuesto a toda la Internet debe residir.

project/ 
web/ 
    index.php 
    css/ 
    js/ 
    images/ 
config/ 
lib/ 
  • web/es la raíz se muestra a los visitantes
  • lib/es aquí la carpeta de la biblioteca, y donde vistazo carga automática de archivos.

Puede agregar más subcarpetas al controlador de proyecto/como, módulos, vista, ayuda, etc. Esto depende de su marco de trabajo.

EDIT:

Si utiliza el compositor (que recomiendo) y tal vez NPM con ronco y menos la estructura de archivos sería el siguiente:

project/ 
    web/ 
     js/ 
     css/ 
     images/ 
     index.php 
    cli/ 
    config/ 
     config.php 
    node_modules/ 
    src/ 
    test/ 
    vendor/ 
    composer.json 
    composer.lock 
    packages.json 
  • web/tiene toda su archivos públicos
  • cli/scripts y programas que se ejecutarán desde la línea de comandos NO la web
  • config/tiene toda su co Archivos nfig (en git usted ignora config.php y en su lugar tiene config.dist.php sin nombres de usuario, contraseñas, códigos de validación y prefijos/sufijos de tabla y otros "secretos")
  • node_modules/tiene todos sus archivos de biblioteca de npm (en git le sugiero que ponga esto en un submódulo)
  • src tiene todos sus archivos PHP locales en la estructura PSR4, creado para carga automática en composer.json
  • prueba/tiene todas las pruebas unitarias para sus clases src, creado en autload-dev en composer.json (recuerde utilizar compositor instalar --no-dev en vivo, tal vez añadir -o si usted no tiene demasiadas clases)
  • vendor tiene todos sus archivos de biblioteca del compositor y el ÚNICO y único autoload.php para ser incluido en la web/índice.php y cualquier script cli (en git sugiero que ignore esta carpeta de proveedor)

Agregue otras carpetas y archivos según sea necesario para su proyecto.

Para usar la distribución de esta estructura:

/sites/project/ (project is your projectname) 
    current (alias to current release folder releases/v1.1.0) 
    previous (optional alias to previous release folder releases/v1.0.1) 
    releases/ 
     v1.0.0/ (git checkout of tag v1.0.0) 
     v1.0.1/ (git checkout of tag v1.0.1) 
     v1.1.0/ (git checkout of tag v1.1.0) 
    shared/ (has all your shared files and folders to be aliased in all releases - maybe something like GlusterFS) 

Hacer un script de implementación. Algo como esto:

Primero tome una copia de seguridad de db o para copiarlo en una nueva base de datos, descargue git repo a la nueva carpeta con la etiqueta de lanzamiento, obtenga todos los submódulos de git, ejecute la instalación del compositor --no-dev, configure cualquier alias para carpetas y archivos compartidos como imágenes cargadas y archivos de configuración, generar js/css con grunt y menos o equivalente, señalar el alias actual a la nueva carpeta con la etiqueta, ejecutar script de la base de datos de actualización, reiniciar servicios de nginx/apache/fpm-php, ejecutar pruebas para verificar que el sitio web esté activo.

Tenga una secuencia de comandos para volver a la versión anterior (o una guía para que sepa qué hacer).

+0

Limpio y simple pero carece de dos carpetas importantes: 'project/tests /' y 'project/class /' (de modo que la carpeta 'lib' se pueda usar para bibliotecas de terceros). ¿Puede ser que la gente tenga otras sugerencias para la estructura de terceros? – Wernight

0

Creo que esto depende de cuán grande será el proyecto. Esto es lo que utilizan sobre todo:

proyecto/
    index.php
    img/
    css/
    JS/
    vistas/
    funciones/

Siempre y cuando todo Los archivos del proyecto están organizados ...

0

Esto es principalmente una cuestión de preferencia, una búsqueda rápida en Google revelaría muchas estructuras de proyectos diferentes. Pero sería realmente bueno si hubiera un estándar acordado. Creo que este initiative de PHP Package Development Standards es un buen candidato.

Esta es la estructura de directorios que se proponen:

  • bin/: los ejecutables de línea de comandos
  • config/: archivos de configuración
  • docs/: archivos de documentación
  • public/: archivos del servidor web
  • recursos/: otros archivos de recursos
  • src/: código fuente PHP
  • pruebas/: código de prueba
0

Esta es la estructura que estoy usando actualmente,

public/   
    assets/   /* js, css, imgs, ... */ 
    index.php 
src/ 
    config/   /* for config files */ 
    helpers/  /* for functions */ 
    libraries/  /* for free classes that are not MVC classes */ 
    models/   /* for M in MVC */ 
    views/   /* for V in MVC */     
    controllers/ /* for C in MVC */ 
    vendor/   /* for vendors files */ 
    uploads/  /* for uploaded images, docs, ... */ 
Cuestiones relacionadas