Zend Framework: автозагрузка библиотеки классов - PullRequest
8 голосов
/ 28 января 2010

У меня есть библиотека классов, определенная здесь ... / имя проекта / библиотека / Me / Myclass.php, определенная следующим образом:

<?php
class Me_Myclass{
}
?>

У меня есть следующий загрузчик:

<?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);
    }

}

В моем контроллере я пытаюсь создать экземпляр класса следующим образом:

<?php
class SomeController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $classMaker=new Me_Myclass();
    }
}
?>

Когда я перехожу на http: /something.com/projectname/some? Id = 1, я получаю следующую ошибку:

Неустранимая ошибка: класс 'Me_Myclass' не найден в /home/myuser/work/projectname/application/controllers/SomeController.php в строке x

Есть идеи?

Потенциально актуальный сборник:

Автозагрузчик работает, когда я расширяю модели классами, которые я определил в других папках в приложении / библиотеке.

Кто-то предложил изменить «По умолчанию», что я и попытался, но, похоже, это не решило проблему и оказало дополнительное негативное влияние на функцию разрушения моделей, использующих это пространство имен.

Ответы [ 4 ]

13 голосов
/ 28 января 2010

Ваш класс должен иметь имя Me_Myclass:

class Me_Myclass
{
}

Переместите папку библиотеки на уровень выше, чтобы у вас была структура папки:

/
    /application
    /library
    /public

Затем добавьте в _initAutoload () следующее:

    Zend_Loader_Autoloader::getInstance()->registerNamespace('Me_');
2 голосов
/ 12 марта 2012

вы можете определить каталог автозагрузки в файле config.ini следующим образом:

autoloaderNamespaces[] = "Me_"


;You could add as many as you want Classes dir:
autoloaderNamespaces[] = "Another_"
autoloaderNamespaces[] = "Third_"

работает 100%

1 голос
/ 16 июня 2010

Я думаю, что @ smack0007 означает заменить содержимое вашего метода _initAutoload на Zend_Loader_Autoloader :: getInstance () -> registerNamespace ('Me_'); так это выглядит так:

protected function _initAutoload()
{
    Zend_Loader_Autoloader::getInstance()->registerNamespace('Me_');
}
0 голосов
/ 08 июля 2010

Не уверен, что это ваша проблема, но я потратил последние полтора дня на то, чтобы выяснить мою собственную подобную проблему (впервые загружая ее на Linux из Windows). Оказывается, я не видел дела с именем папки моей библиотеки.

/library
    /Tlib

не совпадает с (на * nix)

/library
    /tlib

Имя класса, как правило, это

class Tlib_FooMe {
 ...
}

Надеюсь, это поможет тому, кто так же рассеян.

...