(Yaf >=1.0.0)
Yaf_Loader introduce una solución completa de autocarga para Yaf.
La primera vez que se recupera una instancia de la clase Yaf_Application, Yaf_Loader instanciará un singleton, y se registrará a sí mismo con spl_autoload. Se recupera una instancia usando el método Yaf_Loader::getInstance()
Yaf_Loader intenta cargar una clase sólo una vez, y si
falla, dependiendo de yaf.use_spl_auload, si esta configuración
es "On" Yaf_Loader::autoload() devolverá
FALSE
, y así dará otra oportunidad a otra función de autocarga; si es "Off"
(por omisión), Yaf_Loader::autoload() devolverá
TRUE
, y lo que es más importante: emitirá una advertencia muy útil
(muy útil para averiguar por qué no se cargó una clase).
Nota:
Por favor, mantenga yaf.use_spl_autoload en "Off" a menos que exista una biblioteca que tenga su propio mecanismo de autocarga y sea imposible reescribirlo.
Por defecto, Yaf_Loader asume que todas las bibliotecas (las clases definidas en el script) se almacenan en el directorio de clases global, el cual está definido en php.ini (yaf.library).
Si quiere que Yaf_Loader busque algunas clases (bibliotecas) en el directorio de clases local (el cual está definido en application.ini, y por omisión es application.directory . "/libraray"), debería registrar el prefijo de clases usando el método Yaf_Loader::registerLocalNameSpace()
Veamos algunos ejemplos (asumiendo que APPLICATION_PATH es application.directory):
Ejemplo #1 Ejemplo de configuración
// Se asume la siguiente configuración en php.ini: yaf.library = "/global_dir" // Se asume la siguiente configuración en application.ini application.library = APPLICATION_PATH "/library"
Ejemplo #2 Registrar el espacio de nombres local
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initLoader($dispatcher) {
Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
}
?>
Ejemplo #3 Load class example
class Foo_Bar_Test => // APPLICATION_PATH/library/Foo/Bar/Test.php class GLO_Name => // /global_dir/Glo/Name.php class BarNon_Test // /global_dir/Barnon/Test.php
Ejemplo #4 Ejemplo de carga de una clase en el espacio de nombres
class \Foo\Bar\Dummy => // APPLICATION_PATH/library/Foo/Bar/Dummy.php class \FooBar\Bar\Dummy => // /global_dir/FooBar/Bar/Dummy.php
Se puede observar que todas las carpetas tienen la primera letra en mayúsculas, se pueden ponerlas en minúsculas estableciendo yaf.lowcase_path = On en php.ini
Yaf_Loader también está diseñada para cargar las clases MVC, y la regla es:
Ejemplo #5 Ejemplo de carga de clase MVC
Controller Classes => // APPLICATION_PATH/controllers/ Model Classes => // APPLICATION_PATH/models/ Plugin Classes => // APPLICATION_PATH/plugins/
Ejemplo #6 Distinciones de clases MVC
Controller Classes => // ***Controller Model Classes => // ***Model Plugin Classes => // ***Plugin
Ejemplo #7 Ejemplo de carga MVC
class IndexController // APPLICATION_PATH/controllers/Index.php class DataModel => // APPLICATION_PATH/models/Data.php class DummyPlugin => // APPLICATION_PATH/plugins/Dummy.php class A_B_TestModel => // APPLICATION_PATH/models/A/B/Test.php
también, el directorio será afectado por yaf.lowcase_path.Nota:
A partir de 2.1.18, Yaf admite que los Controllers se autocarguen para el lado del scrpt cliente, (lo que significa que la autocarga se desencadena por el script del usuario de php, p.ej., acceder a una propiedad de un Controller estático en Bootstrap o Plugins), aunque el autocargador solamente intenta localizar el controlador bajo la carpeta del módulo predeterminado, que es "APPLICATION_PATH/controllers/".
Por omisión, este valor es application.directory . "/library", se puede cambiar en application.ini (application.library) o llamando al método Yaf_Loader::setLibraryPath()