Расположение моделей БД в Zend Framework - хотите, чтобы они были централизованы - PullRequest
0 голосов
/ 17 июня 2010

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

У меня есть три веб-сайта, которые собираются делиться моделями баз данных.Я структурировал свои приложения так, чтобы у меня был каталог приложений для каждого сайта и общий каталог для каждого сайта.Модели БД находятся в каталоге в библиотеке вместе с Zend Framework и сторонними библиотеками.Я использую класс Autoloader, и когда я пытаюсь создать экземпляр одного из моих классов БД, он не работает.Каталог библиотеки находится в моем пути включения, но по какой-то причине он отказывается создавать экземпляры моих классов.

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

$model = new Model_Login();
$model->hello_world();

Это не удается, когда он находится в библиотеке.Класс - это просто тест:

 class Model_Login
 {
     public function hello_world()
     {
        echo "hello world";
     }
 }

Все работает, пока я не попытаюсь создать экземпляр одной из моих моделей.Я даже пытался переименовать класс во что-то еще (Db_Login), но это тоже не работает.Есть идеи?Заранее спасибо.

Автозагрузчик из Bootstrap:

$autoloader = new Zend_Application_Module_Autoloader(array(
       'namespace' => '',
       'basePath'  => dirname(__FILE__),
));

Ответы [ 4 ]

3 голосов
/ 17 июня 2010

В вашей начальной загрузке используйте

 protected function _initAutoload() {

    $autoloader = new Zend_Application_Module_Autoloader(array(
                'namespace' => 'Default_',
                'basePath' => dirname(__FILE__),
            ));
    $autoloader->addResourceType('models', 'models/', 'Models');
    return $autoloader;
}

Затем просто назовите ваши объекты:

$model = new Default_Models_Login();
$model->hello_world();
1 голос
/ 27 февраля 2011

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

protected function _initAutoload() {

   $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Default_',
            'basePath' => dirname(__FILE__),
        ));
   $autoloader->addResourceType('models', 'models/', 'Models');
   return $autoloader;
}

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

Для моего, я исправляю это с 3x dirname, потому что папка модели немного выше моего файла начальной загрузки модуля.Приложение> Модули> По умолчанию

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

Хорошо, вы используете автозагрузчик модуля в своей начальной загрузке. Он предназначен для использования в начальной загрузке модулей, так как он ищет только одно дерево каталогов (обычно это определенный каталог в application / modules), а не использует путь включения. Его можно использовать в основном загрузчике в качестве автозагрузчика для модуля по умолчанию, поэтому ваш класс работал, когда вы помещали его в приложение / модели.

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

Я предполагаю, что в вашем классе начальной загрузки у вас есть что-то вроде этого:

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath'  => dirname(__FILE__),
    ));

    return $autoloader;
}

измените это на:

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);

    return $autoloader;
}

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

В качестве альтернативы вы можете сделать:

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('Model');

    return $autoloader;
}

, который устанавливает автозагрузчик, а затем говорит ему использовать этот автозагрузчик для пространства имен Model, которое будет соответствовать вашему классу Model_Login.

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

Я бы использовал каталог библиотеки для хранения всех этих моделей. Этим каталогом могут поделиться все сайты.

У меня есть следующий Dir:

применение

  • конфига

  • модель

  • Контроллеры

  • вид

библиотека

  • Myns

  • Zend

1037 * общественное *

и мой конфиг у меня есть:

includePaths.library = APPLICATION_PATH "/../library"
autoloaderNamespaces.Myns = Myns_

, который позволяет мне хранить файлы в Myns и вызывать: Myns_Login

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