Search code examples
phpzend-frameworkautoloadzend-autoloader

Autoloading in zend framework


how to autoload a class in custom directory on module path. My application's structure is like below

application
|_ modules
   |_admin
     |_api
     | |_Core.php
     |_elements
       |_Dialog.php

i have two custom directory, 'api' and 'elements', when i instantiated an object of that two class i have received error message: 'Fatal error class Admin_Api_Core is not found'. I try with registerNamespace but it not work at all

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

Solution

  • You can configure autoloading inside your Module_Bootstrap (almost same approach as in Benjamin Cremer's answer but module based). To do it - create file Bootstrap.php in /modules/admin folder with the following content:

    class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
    {
    
        protected function _initAutoload()
        {
            $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
                'basePath'      => realpath(dirname(__FILE__)),
                'namespace'     => 'Admin',
                'resourceTypes' => array(
                    'api' => array(
                        'path'      => 'api/',
                        'namespace' => 'Api'
                    )
                )
            ));
    
            $autoloader = new Zend_Application_Module_Autoloader(array(
                'namespace' => 'Admin',
                'basePath'  => dirname(__FILE__),
                'resourceloader' => $resourceLoader
            ));
            return $autoloader;
        }
    
    }
    

    After that you'll be able to instantiate class Admin_Api_Core etc. (you should specify all resoursTypes). If you have many modules, you can create such bootstraps for all of them.