开发者

How to Trick Zend loader for multiple classes in one file

开发者 https://www.devze.com 2023-03-09 13:29 出处:网络
I\'m trying to implement custom exception classes for a zend project. I use modules and all my classes are under library.

I'm trying to implement custom exception classes for a zend project. I use modules and all my classes are under library. so a filename DuplicateFileException.php which is under APPLICATION_PATH "/../library/Abra/Exception" contains

class Abra_Exception_FileNotFoundExcpetion extends Exception {}
class Abra_Exception_MissingFileException extends Exception {}
class Abra_Exception_Dup开发者_开发问答licateFileException extends Exception {}
class Abra_Exception_FileIOException extends Exception {}

so the ErrorController works fine when i only throw Abra_Exception_DuplicateFileException because there is indeed a file called DuplicateFileException, but the app breaks when i throw any other than that Exception.

I just can't believe that i have to create a file for each of them. so how to work around it?

thanks for reading.


Proper zend-way would be implementing your own autoloader class. IT will implement autoload method. You can then use Zend_Autoloader autoloader stack to oad your classes. You just need to have some kind of system/logic in your classname->filename mapping.

class Abra_Autoloader 
{
    public function autoload($className)
    {
        if (strpos('Abra_Exception', $className) !== false) {
            include $someFile; //faster
        }
    }
}

//anywhere in bootstrap (preferably in some autoloading section of yours)
//  autoloader will load only classes starting with "abra"
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
$autoloader->pushAutoloader(array('Abra_Autoloader ', 'autoload'), 'Abra'); 

Please note that at least teh autoloader class should be Zend_Loader-loadable :)


The Zend autoloader works by mapping requested class names to filesystem paths so you can't make it load a file for a class where the filename does not match.

If you really want to persist down this path, I'd just include the file in your Bootstrap class, eg

protected function _initRequires()
{
    require_once 'Abra/Exception/DuplicateFileException.php';
    // assuming your "library" folder is on the include path
}
0

精彩评论

暂无评论...
验证码 换一张
取 消