Zend Framework Модели не загружаются автозагрузчиком - PullRequest
3 голосов
/ 21 января 2010

Я настроил свое приложение с помощью Zend_Application. В моем Bootstrap.php есть метод _initAutoload(), который выглядит следующим образом:

 public function _initAutoload(){
     $this->bootstrap("frontController");
     $front = $this->frontController;

     $autoloader = Zend_Loader_Autoloader::getInstance();

     $autoloader->registerNamespace('Client_');
     $autoloader->registerNamespace('Frontend_');
     $autoloader->registerNamespace('Global_');
     $autoloader->registerNamespace('Global_Helper_');
     $autoloader->setFallbackAutoloader(true);

     $modules = $front->getControllerDirectory();
     $default = $front->getDefaultModule();

     foreach (array_keys($modules) as $module) {
         if ($module === $default) {
             continue;
         }

         $autoloader->pushAutoloader(new Zend_Application_Module_Autoloader(array(  
             "namespace" => ucwords($module),
             "basePath" => $front->getModuleDirectory($module),
         )));

     }

     return $autoloader;  
 }

У меня настроен FrontController для префикса модуля по умолчанию (кажется мне более логичным) $front->setParam("prefixDefaultModule", true)

Мне кажется, у меня обычная структура каталогов.

Проблема:

Я настроил субдомены для каждого имеющегося у меня модуля. Все работает отлично в основном основном домене (www). Основным модулем является интерфейс . Если интерфейс является модулем по умолчанию, то все работает :). Хорошо. Сейчас. Для каждого субдомена у меня есть один и тот же index.php, но они изменили значение env . Для субдомена client значение env равно client и т. Д. Каждое значение env соответствует моему разделу application.xml. Каждый раздел поддомена application.xml (client, api и т. Д.) Расширяет основной раздел, который называется defaults (в настоящее время есть также раздел тестирования, который включает ошибки и т. Д., Поэтому каждый поддомен расширяет тестирование, а тестирование расширяет значения по умолчанию).

Каждый раздел субдомена application.xml изменяет имя модуля по умолчанию . Таким образом, для раздела по умолчанию используется внешний интерфейс, для клиента раздела - его клиент и т. Д.

Теперь
Когда я получаю доступ к domain.com / client или domain.com / api - это нормально. И API, и клиент используют Client_Model_NameOfTheModel и, как и предполагалось, расположены: application / modules / client / models / NameOfTheModel.php и DbTable / NameOfTheModel.php РАБОТАЕТ

НО Когда я обращаюсь к модулю из его соответствующего субдомена (client.domain.com, api.domain.com и т. Д.) И модуль по умолчанию был изменен с внешнего интерфейса на имя соответствующего модуля субдомена - он перестает работать. Он даже не выводит эту «трассировку стека».

Предупреждение: include (Client / Model / ContactLists.php) [function.include]: не удалось открыть поток: нет такого файла или каталога в [heres-my-path-to-root] / library / Zend / Loader. php на линии 136

Предупреждение: include () [function.include]: не удалось открыть «Client / Model / ContactLists.php» для включения (include_path = '[heres-my-path-to-root] / library:.: / Usr / lib / php: / usr / local / lib / php ') в [heres-my-path-to-root] /library/Zend/Loader.php в строке 136

Неустранимая ошибка: класс 'Client_Model_ContactLists' не найден в [heres-my-path-to-root] /application/modules/client/controllers/ContactListsController.php в строке 4

Я пробовал 2 дня, чтобы заставить его работать. Это просто не так. Он просто работает в домене по умолчанию и не работает, когда application.xml меняет свой модуль по умолчанию на имя субдомена. Как это. Этот момент очень и очень важен в настоящее время, потому что я не могу продолжить, и это приложение должно выйти из песочницы (в ранней бета-версии) к концу этой недели.

Спасибо всем за советы.
PS. Извините за плохой английский. Это не мой родной язык

Ответы [ 2 ]

3 голосов
/ 22 января 2010

Это просто поверхностное предположение, но похоже, что оно может работать по умолчанию из-за следующих строк:

 $autoloader->setFallbackAutoloader(true);

 $modules = $front->getControllerDirectory();
 $default = $front->getDefaultModule();

 foreach (array_keys($modules) as $module) {
     if ($module === $default) {
         continue;
     }

По сути, если ваш модуль является модулем по умолчанию, он пропускает его, что означает, что он возвращается к резервному автозагрузчику, который я бы предположил, и если автозагрузчик по умолчанию не может найти ваши модели, то в этом и заключается проблема. Правильно ли конкат корневого пути в ошибке и путь класса, который он пытается загрузить?

Кроме того, похоже, что это может быть неправильно

         "namespace" => ucwords($module),

Я думаю, это должно быть

         "namespace" => ucwords($module) . "_",

Как и другие ваши пространства имен.

1 голос
/ 22 января 2010

Какую версию ZF вы используете?

Вы используете более позднюю версию 1.8 - 1.10?

Если это так, вы должны использовать ресурс в Zend_Application для модуля. Он устанавливает автозагрузку для форм, моделей, помощников и т. Д. В ваших модулях.

Если вы используете application.ini, у вас должна быть такая строка для каждого модуля:

resources.modules.module_name = "enabled"

http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.modules

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...