2012-09-13 36 views
12

Estoy empezando a ver Zend Framework 2 (y soy nuevo en ZF en general), y en el user guide, están utilizando la carga automática al agregar un nuevo módulo. Sin embargo, creo que la explicación es bastante desafiante para un novato. Están construyendo un archivo Module.php dentro del directorio de módulos, que entre otras cosas contiene el siguiente código:Zend Framework 2 cargando automáticamente

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

Ahora me hizo algo de investigación en torno a tratar de averiguar lo que esta carga automática se trata. Por lo que yo entiendo, la carga automática utiliza spl_autoload_register() y es una forma de evitar tener require_once() en todas partes en el código. Por lo tanto, cuando intente utilizar una clase que no está definida, se ejecutará el método autoload() que se registró, que simplemente hace una búsqueda en matriz e incluye el archivo siguiente si se agregó.

// Zend/Loader/ClassMapAutoloader.php 
public function autoload($class) 
{ 
    if (isset($this->map[$class])) { 
     require_once $this->map[$class]; 
    } 
} 

Esto parece inteligente debido al rendimiento. Espero que lo que acabo de escribir sea correcto. En base a esto, estoy tratando de averiguar qué está pasando en getAutoloaderConfig() desde el primer fragmento de código, pero estoy bastante confundido. Parece que la matriz devuelta por este método se usa para AutoloaderFactory::factory(), pero no estoy seguro para qué propósito. Parece que la instancia de autocargadores con opciones, pero exactamente lo que hace, no estoy seguro. Supongo que la segunda entrada de la matriz especifica dónde encontrar los archivos fuente para el espacio de nombres del módulo, al menos esa sería mi suposición. La primera entrada que soy, sin embargo, no estoy seguro. En la guía del usuario, que dice lo siguiente:

Como estamos en desarrollo, que no es necesario cargar los archivos a través de la classmap, por lo que proporcionan una matriz vacía para el cargador automático classmap.

El archivo simplemente devuelve una matriz vacía. No estoy seguro de cuál es el propósito de este ClassMapAutoloader.

Lo siento si mi punto no está claro; Básicamente estoy tratando de averiguar qué está pasando en getAutoloaderConfig() y para qué se usa mymodule/autoload_classmap.php. Si alguien pudiera arrojar algo de luz sobre esto, ¡sería muy apreciado!

+8

Zend es tan ingenioso que es ridículo. – wesside

+1

Absolutamente. Pero creo que si logras resolverlo, en realidad es realmente poderoso. Como Magento. –

+0

Lo uso en el trabajo, tiene sus altibajos. Sin embargo, prefiero Kohana y uso las Bibliotecas Zend que pueda necesitar. Lo siento @ andy124, todavía no he usado 2, siento secuestrar tu pregunta. – wesside

Respuesta

21

El mapa de clases está ahí para mostrar PHP de la manera más directa a una clase. Básicamente se trata de decir "Usted está buscando A\Class\Youre\Looking\For, no busque más allá de este archivo:. xyz.php Esto se expresaría así:

return array(
    'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php' 
) 

Sin ella PHP tiene que correr a través de toda la cadena de cargador automático, que puede ser bastante caro. ¿Por qué dice algo sobre "mientras estamos en desarrollo"? Porque los archivos de clase de clase normalmente se generan en el servidor de producción mediante algún script. Básicamente, simplemente no te preocupes demasiado por el momento. Es una micro-optimización ...

El método getAutoloaderConfig() está ahí para darle cierta flexibilidad en aplicaciones realmente avanzadas. La mayoría de las veces puede simplemente usar el Skeleto El código repetitivo de nApplication y SkeletonModule y lo dejan en paz. Realmente, incluso puedes matar la parte 'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',) por el momento.

Es solo un gancho para futuras mejoras y nada de qué preocuparse si solo estás comenzando con ZF2 (como yo;).

+0

Gracias. Lo que escribió sobre ClassMapAutoloader tiene sentido en su ejemplo, pero no estoy seguro de por qué la clave en la matriz es 'Zend \ Loader \ ClassMapAutoloader'. El valor se refiere a un archivo PHP que ni siquiera es una clase; simplemente devuelve una matriz.Supongo que le está diciendo al 'ClassMapAutoloader' que busque en ese archivo la configuración del mapa de clase. No es que lo use en este momento, pero es el propósito de 'autoload_classmap.php' luego simplemente devolver una matriz de nombres de clase como clave y ruta como valor? Como entiendo de su respuesta, esto no es necesario, solo una optimización. – Andy0708

+1

Zend \ Loader \ ClassMapAutoloader es una clase. Ver https://github.com/zendframework/zf2/blob/master/library/Zend/Loader/ClassMapAutoloader.php Así que está diciendo "usa el ClassMapAutoloader y dale el archivo autoload_classmap.php como parámetro". El autocargador utiliza la matriz devuelta de ese archivo para asignar clases a archivos específicos. ¿Está eso un poco más claro? –

8

ZF2 tiene una serie de cargadores automáticos disponibles.

Los 2 más comunes (o los 2 con los que los desarrolladores interactúan directamente de todos modos) son Zend\Loader\ClassMapAutoloader y Zend\Loader\StandardAutoloader.

  1. El cargador automático classmap se utiliza generalmente en el nivel de módulo para proporcionar un simple pero rápido mecanismo de matriz de búsqueda. Se configura con una matriz asociativa de key => value pares, con la clave representando la clase, y el valor que representa el nombre de archivo que define la clase.

  2. El autocargador estándar, por otro lado, está diseñado para contener una lista de "espacios de nombres" y directorios base. Lo que hace es crear la ruta a la clase referenciada, pero aún no cargada, por anteponiendo la ruta del directorio base para ese nombre al nombre de clase , para llegar a la ruta absoluta final al archivo de clase, que luego trata de incluir. Puede rellenar rápidamente el archivo classmap_autoload.php ejecutando /path/to/ZF2/bin/classmap_generator.php o zftool.phar generar classmap.

Zend\Loader\AutoloaderFactory está diseñado para gestionar los distintos cargadores automáticos, y para asegurarse de que no haya conflictos. En última instancia, por supuesto, todas las capacidades de carga automática aprovechan la carga automática PHP SPL.

El propósito de getAutoloaderConfig() es identificar a la fábrica del autocargador qué cargadores automáticos están disponibles para el espacio de nombres de este módulo.

En el ejemplo que se muestra arriba, eso sería, en orden de preferencia, el autocargador de mapa de clases, seguido del autocargador estándar. Si no desea utilizar el autocargador de mapa de clases para ese módulo, simplemente elimine la referencia de la matriz devuelta por getAutoloaderConfig().

El método nombre getAutoloaderConfig() es reservado. Si se define este método, durante el proceso de inicialización del módulo, se adjunta un detector (Zend\ModuleManager\AutoloaderListener) que recupera la configuración devuelta por este método y la agrega a la configuración consolidada.

+0

+1 Explicación muy clara y simple. – Andy0708

3

Una aplicación web consta de muchas clases PHP, y cada clase normalmente reside en un archivo separado. Esto introduce la necesidad de incluyendo los archivos.

A medida que su aplicación crece de tamaño, puede ser difícil incluir cada archivo necesario. Zend Framework 2 en sí mismo consta de cientos de archivos, y puede ser muy difícil cargar la biblioteca completa y todas sus dependencias de esta manera. Además, al ejecutar el código resultante, el intérprete de PHP tardará 0 en procesar cada archivo incluido, incluso si no crea una instancia de su clase.

Para solucionar este problema, en PHP 5.1, se ha introducido la característica de carga automática de clases. La función PHP spl_autoload_register() le permite registrar una función de autocargador . Para sitios web complejos, incluso puede crear varias funciones del autocargador, que están encadenadas en una pila.

Durante la ejecución del script, si PHP intérprete se encuentra con un nombre de clase que no se ha definido aún, llama a todas las funciones del cargador automático registrados a su vez, hasta que la función de cargador automático incluye la clase o "no encontrado" de error es elevado. Esto permite la carga "diferida" cuando el intérprete PHP procesa la definición de la clase solo en el momento de la invocación de la clase, cuando realmente se necesita.

Debido proveedor de cada biblioteca utiliza sus propias convenciones de nombres de código y organización de archivos, que tendrá que registrar una función cargador automático a medida diferente por cada biblioteca dependiente, que es bastante molesto (y en realidad este es un trabajo que no sean necesarios). Para resolver este problema, se introdujo el estándar PSR-0 .

El PSR-0 standard (PSR significa Recomendación Normas PHP) define la estructura del código recomendado que una aplicación o una biblioteca deben seguir para garantizar la interoperabilidad cargador automático.

Cada módulo de la aplicación web registra un cargador automático, lo que permite cargar automáticamente cualquier clase de PHP en sus módulos. Esto se realiza con el método getAutoloaderConfig() de la clase Module.

ZF2 tiene un componente especial llamado Zend\Loader, que contiene las implementaciones de las dos clases de cargador automático de uso común: el cargador automático estándar (Zend\Loader\StandardAutoloader) y asignación de clase cargador automático (Zend\Loader\ClassMapAutoloader).

El hecho de que los módulos de aplicaciones basados ​​en ZF2 cumplan con el estándar PSR-0 hace posible el uso del autocargador estándar.

El autocargador de mapa de clases se puede utilizar como un reemplazo más rápido para el autocargador estándar. Este autocargador espera que le pase una matriz de mapa de clase. Cada clave => valor del mapa de la clase es, respectivamente, el nombre de la clase y la ruta del archivo PHP que contiene la clase.

El concepto de carga automática en Zend Framework 2 está bien explicado en el libro Using Zend Framework 2.