2012-08-08 12 views
8

Me gustaría familiarizarme con Zend Framework 2 utilizándolo para un proyecto pequeño. He revisado varios artículos de blogs, documentos y, por supuesto, el fantástico tutorial de Akrabat (Rob Allen).¿Cuál es la estructura de directorios correcta o preferida para un módulo Zend Framework 2?

Sin embargo, en toda mi lectura no he encontrado ninguna explicación sobre la estructura de directorios correcta o preferida para un módulo que Zend Framework 2 espera.

En el Akrabat tutorial, el módulo de ejemplo de Rob Allen utiliza un único modelo y controlador. La estructura de directorios que eligió fue:

/module 
    /Album 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
     /view 
      /album 
       /album 

todo esto está bien, pero lo que si un módulo tiene varios controladores y modelos como era de esperar en un sitio que tenía múltiples páginas/secciones? ¿Colocaría todos mis controladores en el directorio/src/Album/Controller, o crearía otro conjunto de directorios/src/xxx/para cada modelo adicional y controladores y vistas relacionados?

En los directorios/ver, ¿lo divido en subdirectorios para cada conjunto de vistas utilizado por los distintos controladores?

Creo que la confusión para mí viene del hecho de que en el ejemplo de Rob, su controlador/modelo principal es el mismo nombre que el módulo. Por lo tanto, su módulo Album tiene un directorio, con más Álbum directorios para los modelos, controladores y vistas. Si tuviera que cambiar el nombre de su módulo de álbum a, por ejemplo, MyModule sería la estructura de directorios y luego se convierten en:

/module 
    /MyModule 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
     /view 
      /MyModule 
       /album 

¿Sería entonces sigue este un modelo adicional, artista y controladores asociados serían organizado así:

/module 
    /MyModule 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
      /Artist 
       /Controller 
       /Form 
       /Model 
     /view 
      /MyModule 
       /album 
       /artist 

Si no es lo anterior, ¿qué estructura sería?

Esto, por supuesto, supone que ZF2 espera una estructura estricta. Si este no es el caso, obviamente puedo organizarlo de la manera que quiero.

Respuesta

14

Para responder rápidamente a su pregunta final, ZF2 realmente no se preocupa por la estructura del directorio. O mejor dicho, no tiene una estructura predefinida. Esa es la razón por la que tiene las configuraciones del autocargador y los mapas de clase (dependiendo del enfoque que elija usar).

El cargador automático 'por defecto' (ver module.php), que se puede encontrar en la mayoría de los ejemplos sólo se asume que sus clases ModuleName se encuentran en el directorio ./src/ModuleName:

// ./modules/ModuleName/Module.php 
public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
      ), 
     ), 
    ); 
} 

Asumo que sabes que eso es lo que significan esas partes __NAMESPACE__.

Por lo tanto, si tiene un módulo llamado Cat, se espera que las clases se encuentren en ./modules/Cat/src/Cat.

Si luego decide agregar alguna funcionalidad nueva en su aplicación, agregará otro módulo llamado Dog y colocará sus archivos de clase en ./Dog/src/Dog.

Sin embargo, eso de ninguna manera significa que tiene que hacerlo de esta manera. También puede colocar todas sus clases relacionadas con animales en un módulo llamado, p. Animals. Usted tendría que modificar su cargador automático a tener este aspecto:

// ./modules/Animals/Module.php 
public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       'Cat' => __DIR__ . '/src/Cat', 
       'Dog' => __DIR__ . '/src/Dog', 
      ), 
     ), 
    ); 
} 

... y coloque sus clases en archivos como ./modules/Animal/src/Cat/Persian.php y ./modules/Animal/src/Dog/Collie.php.

Una cosa que sugeriría sin embargo es pensar en los módulos como entidades separadas sin saber nada específico sobre los otros módulos. Como ejemplo de "vida real", tengo una aplicación que tiene una interfaz (html, css, etc.) y una funcionalidad de API.

tengo 3 módulos:

  • Application - contiene configuraciones de bases de datos, las clases de la tabla db, creadores de mapas, modelos, clases de autenticación, etc. Básicamente todo lo que pueda necesitar cualquier otro módulo.
  • Api - tiene controladores que esperan solicitudes en un formato específico y lo generan, como p. Ej. JSON (es decir, no se requieren vistas). Las clases en este módulo están utilizando clases del módulo de Aplicación, ya que todavía necesito toda la funcionalidad de la base de datos, pero tenerlo todo separado me da la separación de la lógica de la API de la aplicación. Podría extraer este módulo y no rompería nada más.
  • Website - módulo responsable solo por la renderización de páginas. Una vez más, utiliza clases de la Aplicación, ya que quiero poder renderizar datos de la base de datos y permitir que los usuarios editen, pero no quiero que la funcionalidad sea exclusiva de este módulo ya que Api también lo necesita.

Mis ./config/application.config.php los carga en este orden:

return array(
    'modules' => array(
     'Application', 
     'Api', 
     'Website', 
    ), 
    // all other entries 
); 

Esto significa que tengo acceso a las clases de la aplicación de todos los demás módulos. Si quisiera desactivar mi API por alguna razón, simplemente eliminaría el directorio Api y mi interfaz seguiría funcionando.

Espero que esto ayude! :)

TL; DR Puede estructurar archivos de la forma que desee, simplemente no olvide configurar el autocargador correctamente.

Cuestiones relacionadas