Используйте Zend_Autoloader для моделей

Кто-нибудь знает, как использовать «новый» Zend Autoloader для загрузки моделей? В данный момент моя конфигурация выглядит так:

приложение.ini

# Autoloader Namespace
autoloadernamespaces.0 = "Sl_"

Bootstrap.php

   /**
     * Start Autoloader
     *
     * @access protected
     * @return Zend_Application_Module_Autoloader
     */
    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Sl_',
            'basePath'  => dirname(__FILE__),
        ));

        return $autoloader;
    } 

Поэтому, когда я помещаю модель в /Models/User.php с

class Sl_Model_User{}

и создайте новый объект, все работает как задумано. Но как я могу использовать автозагрузчик для загрузки модели, размещенной в /Models/Dao/UserDB.php?

class Dao_UserDB{}

person opHASnoNAME    schedule 11.08.2009    source источник


Ответы (3)


Ознакомьтесь с документацией по Resource_Autoloader (его цель — загружать ресурсы, которые находятся в каталоге моделей или где-то еще, то есть вне папки /library).

«Автозагрузчики ресурсов предназначены для управления кодом библиотеки с пространством имен, который соответствует стандартным рекомендациям по кодированию Zend Framework, но не имеет сопоставления 1: 1 между именем класса и структурой каталогов. Их основная цель — облегчить автоматическую загрузку кода ресурса приложения, такого как модели, формы и ACL для конкретных приложений.

Автозагрузчики ресурсов регистрируются в автозагрузчике при создании экземпляра в пространстве имен, с которым они связаны. Это позволяет вам легко создавать код пространства имен в определенных каталогах и по-прежнему пользоваться преимуществами автозагрузки».

path/to/some/directory/
    acls/
         Site.php
    forms/
        Login.php
    models/
        User.php


$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath'  => 'path/to/some/directory',
'namespace' => 'My',

));

$resourceLoader->addResourceTypes(array(
'acl' => array(
    'path'      => 'acls/',
    'namespace' => 'Acl',
),
'form' => array(
    'path'      => 'forms/',
    'namespace' => 'Form',
),
'model' => array(
    'path'      => 'models/',
),

));

Попробуйте это в вашем файле boostrap:

protected function _initLoaderResource()
{
    $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
        'basePath'  => 'your_doc_root' . '/application',
        'namespace' => 'MyNamespace'
    ));
    $resourceLoader->addResourceTypes(array(
        'model' => array(
            'namespace' => 'Model',
            'path'      => 'models'
        )
    ));
}
person Andreas    schedule 11.08.2009
comment
Привет, а где загрузить Resourceloader? или я могу добавить это в загрузчик модулей? - person opHASnoNAME; 12.08.2009
comment
Попробуйте это в вашем защищенном файле boostrap. $resourceLoader-›addResourceTypes( array('model' =› array( 'namespace' =› 'Model', 'path' =› 'models' ) )); } - person Andreas; 12.08.2009

В зависимости от вашей текущей настройки

Файл класса: /Models/Dao/UserDB.php

ClassName: класс Dao_UserDB{}

должно быть:

$autoloader = new Zend_Application_Module_Autoloader(array(
    'namespace' => 'Dao_',
    'basePath'  => APPLICATION_ROOT.'/Models/Dao/',
));

Но вы также можете назвать класс: S1_Dao_UserDB(), это должно работать без изменений.

person Rufinus    schedule 11.08.2009

Чтобы определить правила автозагрузчика для пользовательских моделей (в каталоге пользовательской библиотеки), например:

|-application
|-library
  |-Foo
    |-Models
      |-Bar.php (holds Foo_Model_Bar class - mind no 's' in class name)
    |-Forms 
      |-Bar.php (holds Foo_Form_Bar class - mind no 's' in class name)
  |-Zend
|-public
|-test

Вы должны добавить это в свой Bootstrap.php

/**
 * Enable loading custom  classes
 */
public function _initAutoloaders()
{
    $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
        'basePath' => APPLICATION_PATH . '/../library/Foo',
        'namespace' => 'Foo_'
    ));

    $resourceLoader->addResourceTypes(array(
        'foomodels' => array(
            'namespace' => 'Model_',
            'path' => 'Models')
        ),
        'fooforms' => array(
            'namespace' => 'Form_',
            'path' => 'Forms')
        ),
    );
}

Мне потребовалось некоторое время, чтобы понять это, надеюсь, это сэкономит чье-то время.

person jkulak    schedule 17.05.2012