2010-01-28 11 views
8

Tengo una biblioteca de clases en el definido aquí .../projectname/biblioteca/Me/Myclass.php define como sigue:Zend Framework: carga automática una biblioteca de clases

<?php 
class Me_Myclass{ 
} 
?> 

Tengo el siguiente bootstrap:

<?php 

/** 
* Application bootstrap 
* 
* @uses Zend_Application_Bootstrap_Bootstrap 
*/ 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    /** 
    * Bootstrap autoloader for application resources 
    * 
    * @return Zend_Application_Module_Autoloader 
    */ 
    protected function _initAutoload() 
    { 
     $autoloader = new Zend_Application_Module_Autoloader(array(
      'namespace' => 'Default', 
      'basePath' => dirname(__FILE__), 
     )); 
     $autoloader->registerNamespace('Me_'); 
     return $autoloader; 
    } 

    /** 
    * Bootstrap the view doctype 
    * 
    * @return void 
    */ 
    protected function _initDoctype() 
    { 
     $this->bootstrap('view'); 
     $view = $this->getResource('view'); 
     $view->doctype('XHTML1_STRICT'); 
    } 

    /** 
    * Bootstrap registry and store configuration information 
    * 
    * @return void 
    */ 
    protected function _initRegistry() 
    { 
     $config = new Zend_Config_Ini(APPLICATION_PATH . 
             '/configs/application.ini', APPLICATION_ENV, 
             array('allowModifications'=>true)); 
     Zend_Registry::set('configuration', $config); 
    } 

} 

En mi controlador de trato de crear una instancia de la clase como esta:

<?php 
class SomeController extends Zend_Controller_Action 
{ 
    public function indexAction() 
    { 
     $classMaker=new Me_Myclass(); 
    } 
} 
?> 

Cuando navego directamente a http:/somethi ng.com/projectname/some?id=1 Recibo el siguiente error:

Error fatal: no se encuentra la clase 'Me_Myclass' en /home/myuser/work/nombredeproyectos/application/controllers/SomeController.php en la línea x

¿Alguna idea?

Miscelánea potencialmente pertinente:

El cargador automático parece funcionar cuando se les extiendo modelos con las clases he definido en otras carpetas bajo application/biblioteca.

Alguien sugirió cambiar el 'Predeterminado', que intenté pero no pareció solucionar el problema y tuvo el impacto negativo adicional de la función de corte de los modelos que usan este espacio de nombres.

Respuesta

12

clase que usted tiene que ser Me_Myclass nombre:

class Me_Myclass 
{ 
} 

Mueva su carpeta de la biblioteca a un nivel superior para que tenga la estructura de carpetas:

/ 
    /application 
    /library 
    /public 

Y luego, en su Bootstrap añadir lo siguiente a the _initAutoload():

Zend_Loader_Autoloader::getInstance()->registerNamespace('Me_'); 
+0

Hola, gracias por su respuesta, me trataron esto y recibimos un error a continuación. ¿Qué indica eso? Error fatal: excepción no detectada 'Zend_Loader_Exception' con el mensaje 'Método' registerNamespace 'no es compatible' en /home/myuser/work/myproject/library/Zend/Loader/Autoloader/Resource.php:128 Stack trace: http: // pastie.org/799074 – user250120

+0

Actualice su respuesta para mostrar los cambios en el código que ha realizado. – smack0007

1

Creo que @ smack0007 significa reemplazar el contenido de su método _initAutoload con Zend_Loader_Autoloader :: getInstance() -> registerNamespace ('Me_'); por lo que se ve así:

protected function _initAutoload() 
{ 
    Zend_Loader_Autoloader::getInstance()->registerNamespace('Me_'); 
} 
0

No estoy seguro si este es su problema, pero me acaba de pasar el último día y medio tratando de encontrar mi propio problema similar (por primera vez de cargarlo hasta en Linux desde Windows). Resulta que estaba ciego al caso del nombre de la carpeta de mi biblioteca.

/library 
    /Tlib 

no es lo mismo que (en * nix)

/library 
    /tlib 

Nombre de clase es típicamente esta

class Tlib_FooMe { 
... 
} 

Espero que esto ayude a alguien que es igualmente distraído.

2

puede definir el directorio de autocarga en la configuración.ini así:

autoloaderNamespaces[] = "Me_" 


;You could add as many as you want Classes dir: 
autoloaderNamespaces[] = "Another_" 
autoloaderNamespaces[] = "Third_" 

funciona al 100%