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'',
),
),
);