ZEND Framework: Autoloading uma biblioteca de classes
-
23-09-2019 - |
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.
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.