Pergunta

Eu tenho uma biblioteca de classe em definido aqui .../ProjectName/Library/me/myclass.php definido da seguinte forma:

<?php
class Me_Myclass{
}
?>

Eu tenho o seguinte 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);
    }

}

No meu controlador, tento instanciar a classe assim:

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

Quando eu navego diretamente para http: /something.com/projectname/some? Id = 1 Recebo o seguinte erro:

Erro fatal: classe 'me_myclass' não encontrada em /home/myuser/work/projectname/application/controllers/somecontroller.php na linha x

Alguma ideia?

Miscelânea potencialmente pertinente:

O Autoloader parece funcionar quando estou estendendo modelos com classes que defini em outras pastas em Application/Library.

Alguém sugeriu alterar o 'padrão', que eu tentei, mas não parecia resolver o problema e teve o impacto negativo adicional da função de quebra dos modelos usando esse espaço para nome.

Foi útil?

Solução

Sua classe precisa ser nomeada me_myclass:

class Me_Myclass
{
}

Mova sua pasta de biblioteca para cima um nível para ter a estrutura da pasta:

/
    /application
    /library
    /public

E então, no seu bootstrap, adicione o seguinte ao _initautoload ():

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

Outras dicas

Você pode definir o Autoload Dir no arquivo config.ini como este:

autoloaderNamespaces[] = "Me_"


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

funciona 100%

Eu acho que @smack0007 significa substituir o conteúdo do seu método _initautoload com zend_loader_autoloader :: getInstance ()-> registrnamespace ('me_'); Então parece isso:

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

Não tenho certeza se esse é o seu problema, mas passei o último dia e metade tentando descobrir meu próprio problema semelhante (pela primeira vez carregando -o no Linux no Windows). Acontece que eu estava cego para o estojo de nome da pasta da minha biblioteca.

/library
    /Tlib

não é o mesmo que (no *nix)

/library
    /tlib

O nome da classe é tipicamente isso

class Tlib_FooMe {
 ...
}

Espero que isso ajude alguém que é igualmente distraído.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top