Use Zend Autoloader para Modelos
-
12-09-2019 - |
Pergunta
faz alguém sabe como usar o "novo" Zend Autoloader para carregar Models? No momento em que meus olhares de configuração como esta:
application.ini
# Autoloader Namespace
autoloadernamespaces.0 = "Sl_"
Bootstrap.php
/**
* Start Autoloader
*
* @access protected
* @return Zend_Application_Module_Autoloader
*/
protected function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Sl_',
'basePath' => dirname(__FILE__),
));
return $autoloader;
}
Então, quando eu colocar um modelo em /Models/User.php com
class Sl_Model_User{}
e criar um objeto novo, tudo funciona como projetado. Mas como eu posso usar o Autoloader para carregar um modelo colocado em /Models/Dao/UserDB.php?
class Dao_UserDB{}
Solução
Verifique a documentação sobre o Resource_Autoloader (sua finalidade é a recursos de carga que residem no diretório modelos ou em outro lugar - ou seja fora da pasta / biblioteca).
"autoloaders recursos destinam-se a gerir o código da biblioteca namespaced que seguem Zend Framework diretrizes de codificação padrão, mas que não têm um. 1: mapeamento 1 entre o nome da classe e da estrutura de diretório Seu objetivo principal é facilitar auotocarregáveis ??código de recurso de aplicativo , tais como os modelos específicos de aplicação, formas, e ACLs.
autoloaders recursos registrar com o autoloader na instanciação, com o namespace ao qual eles estão associados. Isso permite que você facilmente código namespace em diretórios específicos, e ainda colher os benefícios de carregamento automático. "
path/to/some/directory/
acls/
Site.php
forms/
Login.php
models/
User.php
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
));
$resourceLoader->addResourceTypes(array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
),
));
Tente isto em seu arquivo boostrap:
protected function _initLoaderResource()
{
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'your_doc_root' . '/application',
'namespace' => 'MyNamespace'
));
$resourceLoader->addResourceTypes(array(
'model' => array(
'namespace' => 'Model',
'path' => 'models'
)
));
}
Outras dicas
Dependendo da configuração atual
classfile: /Models/Dao/UserDB.php
ClassName: classe Dao_UserDB {}
deve ser:
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Dao_',
'basePath' => APPLICATION_ROOT.'/Models/Dao/',
));
Mas você também pode nomear o Classe: S1_Dao_UserDB () isso deve funcionar sem alterar.
Para definir autoloader regras para modelos personalizados (em biblioteca personalizada dir) como:
|-application
|-library
|-Foo
|-Models
|-Bar.php (holds Foo_Model_Bar class - mind no 's' in class name)
|-Forms
|-Bar.php (holds Foo_Form_Bar class - mind no 's' in class name)
|-Zend
|-public
|-test
Você deve adicionar isso no seu Bootstrap.php
/**
* Enable loading custom classes
*/
public function _initAutoloaders()
{
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => APPLICATION_PATH . '/../library/Foo',
'namespace' => 'Foo_'
));
$resourceLoader->addResourceTypes(array(
'foomodels' => array(
'namespace' => 'Model_',
'path' => 'Models')
),
'fooforms' => array(
'namespace' => 'Form_',
'path' => 'Forms')
),
);
}
Levei um tempo para descobrir isso, espero que salva alguém tempo.