php zend-framework autoload zend-framework2

php - Autoload biblioteca personalizada en Zend Framework 2.0



zend-framework zend-framework2 (5)

He encontrado la respuesta. Pon esto en tu index.php:

require_once ''vendor/ZendFramework/library/Zend/Loader/StandardAutoloader.php''; $loader = new Zend/Loader/StandardAutoloader(); $loader->registerNamespace(''Garvey'', realpath(''vendor/Garvey/library/Garvey'')); $loader->register();

Necesito usar carga automática para mis clases personalizadas en Zend Framework 2.0 . Mi biblioteca personalizada ubicada en /vendor/Garvey/library/Garvey . Tengo una clase simple AbstractTable extendida en /vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php :

<?php namespace Garvey/Db/Table; use Zend/Db/Table/AbstractTable; abstract class AbstractTable extends AbstractTable { public function getItemById($id) { } }

En el index.php tengo el siguiente código:

require_once ''vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php''; Zend/Loader/AutoloaderFactory::factory(array(''Zend/Loader/StandardAutoloader'' => array( ''prefixes'' => array( ''Garvey'' => ''vendor/Garvey/library/Garvey'', ) )));

Pero tengo el siguiente error. Lo que me he perdido?

Fatal error: Class ''Garvey/Db/Table/AbstractTable'' not found

Gracias de antemano.


Su index.php original también funcionaría si cambiara la clave ''prefijos'' a ''espacios de nombres'' y especificara una ruta como la siguiente:

Zend/Loader/AutoloaderFactory::factory(array(''Zend/Loader/StandardAutoloader'' => array( ''namespaces'' => array( ''Garvey'' => dirname(__DIR__) . ''/vendor/Garvey'', ) )));


O puede usar el método de defime en Module.php

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

Pero no lo recomendaría. Dado que el propósito de ZF2 está centrado en la velocidad en la carga automática, la mejor manera es usar el estilo class_map para cargar sus clases. Funcionará mucho más rápido al final pero requerirá trabajo adicional. Puede registrar todas las clases en su archivo class_map.

Puede crear class_map.php en la raíz de su biblioteca y colocar allí

<?php return array( ''Garvey/Db/Table/AbstractTable'' => __DIR__ . ''/Garvey/Db/Table/AbstractTable.php'', );

Y agregue allí tantas clases como use. Y en getAutoloaderConfig () puedes agregar tu mapa de clases

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


Matthew Weier O''Phinney explica en este video que ahora hay 3 métodos para carga automática:

  • ZF1-style include_path autocargador ( antiguo método zf1, no recomendado )
  • Autoubicación por espacio de nombres / prefijos ( nuevo método zf2, mejor )
  • Autocarga de mapa de clase ( recomendado y el más rápido )

En los documentos se menciona una utilidad del generador de mapas de clase que se encargará de escribir el /vendor/vendor_name/library/autoload_classmap.php por usted.

La solución que encontraste es similar a la que menciona Matthew en el video para la carga automática del nombre / espacio por nombre. Siguiendo la estructura del código en ZendSkeletonApplication , ese código iría en el archivo /init_autoloader.php , en lugar de en el archivo /public/index.php .


Echa un vistazo rápido a esta publicación .

Ahora el siguiente paso es agregar un código en nuestra biblioteca personalizada.

Antes que nada abra un archivo ./vendor/Garvey/autoload_classmap.php

return array( ''Garvey/Module'' => __DIR__ . ''/Module.php'', ''Garvey/Db/Table'' => __DIR__ . ''/library/Garvey/Db/Table/AbstractTable.php'', )

El siguiente es ./vendor/Garvey/Module.php

namespace Garvey; use Zend/ModuleManager/Feature/AutoloaderProviderInterface; class Module implements AutoloaderProviderInterface { public function getAutoloaderConfig() { return array( ''Zend/Loader/ClassMapAutoloader'' => array( __DIR__ . ''/autoload_classmap.php'', ), ''Zend/Loader/StandardAutoloader'' => array( ''namespaces'' => array( __NAMESPACE__ => __DIR__ . ''/library/'' . __NAMESPACE__, ), ), ); } }

Ahora dentro de tu biblioteca crea un archivo dentro de una carpeta:

./vendor/Kdecom/library/Kdecom/Db/Table/AbstractTable.php

Una última cosa que tenemos que hacer es agregar esta biblioteca a su archivo application.config.php .

Entonces su archivo application.config.php verá así ...

return array( ''modules'' => array( ''Application'', ''Garvey'' ), ''module_listener_options'' => array( ''config_glob_paths'' => array( ''config/autoload/{,*.}{global,local}.php'', ), ''module_paths'' => array( ''./module'', ''./vendor'', ), ), );