使用Zend Framework自动加载器使用的命名约定解决“问题”

时间:2010-12-16 17:47:28

标签: zend-framework zend-autoloader

假设我有一个包含用户的表格。因此,该表中的每一行都是用户。这里重要的部分是复数与单数形式。

现在,让我们看看我们在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.phpUsersModel.php

因此,这个漫长而有点诗意的问题的问题是:

有没有办法绕过这个没有开始手动使用包含?

3 个答案:

答案 0 :(得分:1)

实际上建议将表类放在模型中的db文件夹中,因此对于表,它们是models / dbtable / users.php和类名Model_DbTable_Users,对于具体用户,它们是models / user.php和Model_User。但是如果你决定跳过这个问题我没有看到模型/ user.php与Model_User和models / users.php与Model_Users作为表的问题。

答案 1 :(得分:0)

首先让我说 never 使用/model目录自动加载目录结构。我个人更喜欢将我的模型放在我为该应用程序创建的“库”中。 以下是我application.ini

的摘录
includePaths.library = APPLICATION_PATH "/../library"    
autoloadernamespaces[] = "SNTrack_"

我的用户将为SNTrack_Model_User,位于/library/SNTrack/Model/User.php。我会打电话给表格 SNTrack_Model_UserTable

答案 2 :(得分:0)

看起来像是标准的自动加载器。

请确保使用以下内容初始化自动加载器,可能是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; - )