Модульное приложение Zend Framework, не можете загрузить модели для каждого модуля, автозагрузка моделей? - PullRequest
6 голосов
/ 06 октября 2009

Есть ли способ иметь модели для каждого модуля? У меня есть 3 модуля, один из которых является «контактным» модулем. Я создал модель для этого в модулях / контактах / моделях / Codes.php Коды контроллера

class Contacts_CodesController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    $this->view->messages = $this->_helper->flashMessenger->getMessages();  

    }

    public function indexAction()
    {

    $codesTable = new Contacts_Model_Codes();

    }

Коды Модель:

class Contacts_Model_Codes extends Zend_Db_Table
{
    protected $_name = 'codes';
}

Я получаю ошибку: Неустранимая ошибка: класс «Contacts_Model_Codes» не найден в /Applications/MAMP/htdocs/zf_site/application/modules/contacts/controllers/CodesController.php строке 26

спасибо

Ответы [ 5 ]

18 голосов
/ 14 октября 2009

Я нашел проблему. Я забыл поместить файл начальной загрузки с моим модулем контактов. Теперь все работает, и мои модули могут использовать свои собственные модели.

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap
{

}
6 голосов
/ 01 ноября 2010

Я нашел решение, наверное! :) Это проблема при добавлении следующего ресурса в файл application.ini

resources.frontController.defaultModule = "Default"

, а также вы используете какие-то параметры. Я думаю, что это ошибка.

Правильный способ реализации модулей:

1 - Создайте нужные модули и модуль ' По умолчанию ' с помощью инструмента zf

2 - В apllication.ini сообщить ZF, где находятся модули и где находятся контроллеры этих модулей, с помощью

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.moduleControllerDirectoryName = "controllers"

Используйте известный

resources.modules = ""

и набор:

resources.frontController.params.prefixDefaultModule = ""

Это важно, потому что инструмент zf установил его в "1". Вот ошибка. :)

И помните, что НЕ ставьте то, что является модулем по умолчанию !!

3 - Создайте файл начальной загрузки для каждого модуля и вставьте:

Если мой модуль 'Evacol':

<?php
class Evacol_Bootstrap extends Zend_Application_Module_Bootstrap
{
}

Сохранить его в / modules / Evacol / очевидно

Обратите внимание на Evacol_ ... и ..._ Module_Bootstr ... ИМЯ МОЕГО МОДУЛЯ, РАСШИРЯЮЩЕГО ПРАВИЛЬНЫЙ КЛАСС. Не используйте значение по умолчанию для файла начальной загрузки, созданного с помощью инструмента zf. Я сделал это :) 1040 *

НЕ ИЗМЕНИТЕ НИЧЕГО. ЭТО НЕ НУЖНО.

И вуаля! Доверьтесь мне. Это работает!

Это был Zend Framework 1.10.8

5 голосов
/ 13 сентября 2010

добавить

resources.modules[] =

К вашей конфигурации INI

5 голосов
/ 06 октября 2009

Вы должны зарегистрировать пространство имен «Contacts_» в автозагрузчике. Для этого вы можете использовать Zend_Application_Module_Autoloader.

$autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => 'Contacts_',
        'basePath'  => dirname(__FILE__) . '/modules/cotacts',
    ));

Это создаст следующие сопоставления для вашего модуля в указанном вами basePath.

api/         => Api
forms/       => Form
models/      => Model
    DbTable/ => Model_DbTable
plugins/     => Plugin

Если вы используете Zend_Application для ускорения своего приложения и его модулей, вам это не нужно, потому что в документах говорится, что:

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

2 голосов
/ 06 октября 2009

Я использую версию 1.9. Это часть моей начальной загрузки:

protected function _initAutoload() {
    $modelLoader = new Zend_Application_Module_Autoloader(array(
                  'namespace' => '',
                   'basePath' => APPLICATION_PATH.'/modules/default')

        );
}

    protected function _initAutoloaders()
    {
        $this->getApplication()->setAutoloaderNamespaces(array('Eric_'));
        return $this;
    }

    protected function _initPlugins()
    {
        $this->bootstrap('autoloaders');
        $this->bootstrap('frontController');

        // register the plugin for setting layouts per module
        $plugin = new Eric_Plugin_Modularlayout();
        $this->frontController->registerPlugin($plugin);
            return $modelLoader;
    }

Плагин Eric_Plugin_Modularlayout устанавливает правильный макет для каждого модуля.

У меня 3 модуля: по умолчанию, ez, контакты. Самое смешное, что в действии контактов я могу назвать моделей в директории ez / models. без проблем.

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