Обойти «проблему» с соглашениями об именах, используемыми автозагрузчиком Zend Framework - PullRequest
0 голосов
/ 16 декабря 2010

Допустим, у меня есть таблица, содержащая пользователей . Таким образом, каждая строка в этой таблице является пользователем . Важной частью здесь является множественное число против единственного числа.

Теперь давайте посмотрим, как мы настроили модели для них в Zend Framework:

class Model_Users extends Zend_Db_Table_Abstract
{
  protected $_name      = 'users';
  protected $_primary   = 'user_id';
}

Теперь давайте предположим, что нам нужен еще один пользовательский объект, отличный от стандартной строки, возвращаемой Zend_Db_Table, но мы все же хотели бы сохранить его функциональность, просто расширив его. Тогда имеет смысл реализовать и назвать одного пользователя как:

class Model_User extends Zend_Db_Table_Row_Abstract
{
  ... Bunch of cool functions here :)
}

Затем мы просто добавляем protected $_rowClass = 'Model_User'; к классу Model_Users, и мы закончили ... Обычно это будет , но, похоже, здесь проблема в том, как Zend Framework автоматически загружает классы. Так как мы можем иметь структуру папок /defaut/models/foo.php и назвать класс в этом Model_Foo. У папки есть имя во множественном числе, но у класса есть единственное. Кажется, это становится проблемой, когда я хочу иметь вышеупомянутую структуру. Поскольку Zend Framework, похоже, не может различить UserModel.php и UsersModel.php.

Итак, вопрос к этому длинному и несколько поэтическому вопросу:

Есть ли способ обойти это, БЕЗ начала использования вручную включает?

Ответы [ 3 ]

1 голос
/ 16 декабря 2010

На самом деле рекомендуется поместить ваши классы таблиц в папку db внутри моделей, поэтому это будут models / dbtable / users.php и имя класса Model_DbTable_Users для таблицы, а также models / user.php и Model_User для конкретного пользователя.Но если вы решите пропустить это, я не вижу проблемы в том, чтобы model / user.php с Model_User и models / users.php с Model_Users в виде таблицы.

0 голосов
/ 17 декабря 2010

Похоже на стандартную функцию автозагрузчика.

Обязательно инициализируйте автозагрузчик, возможно, в Bootstrap.php, используя что-то вроде:

protected function _initAutloader()
{
     $autoloader = new Zend_Application_Module_Autoloader(array(
         'basePath'    => APPLICATION_PATH,
          'namespace'  => '',
     ));
}

Затем в application/models/User.php вы определяете свой класс Model_User. И в application/models/Users.php вы определяете свой класс Model_Users.

Все должно быть хорошо. #FamousLastWords; -)

0 голосов
/ 16 декабря 2010

Позвольте мне начать с того, что я никогда не использовал структуру каталогов автозагрузки каталога /model.Я лично предпочитаю помещать свои модели в «библиотеку», которую я создаю для этого приложения.Вот выдержка из моего application.ini

includePaths.library = APPLICATION_PATH "/../library"    
autoloadernamespaces[] = "SNTrack_"

Мой пользователь будет SNTrack_Model_User и расположен в /library/SNTrack/Model/User.php.Я бы назвал стол SNTrack_Model_UserTable.

...