【问题标题】:Should these kind of models be singleton? (Zend Framework)这些模型应该是单例的吗? (Zend 框架)
【发布时间】:2012-11-28 13:15:59
【问题描述】:

在我的项目中,名为 Object_X 的类表示 X 类的单个实例(数据库表中的一行)。

我还必须创建模型来支持这些 Object_X 类。例如:我认为像“isEmailAddressTaken($email)”或“isLogged()”这样的方法(例如对于客户数据库表)应该放在模型(Model_Customer)中,对吗?

现在,如果一个类 Object_X 代表数据库中的一行,而一个 Model_X 代表一般的 db 表,那么 Model_X 应该是单例吗?

我有点困惑。

【问题讨论】:

    标签: model-view-controller zend-framework models


    【解决方案1】:

    这取决于任务。 Zend 框架除了数据库访问之外还有更多功能,这可能会对您有所帮助。

    具体来说,对于任何类型的验证,您都应该使用Zend_Validate 并根据需要创建验证器。例如,为了检查电子邮件是否已被占用,您应该声明 Application_Validate_UserEmail_NotExists 扩展 Zend_Validate_Abstract。那么你就可以在任何你需要的地方使用该验证器类(尤其是在表单中)

    <?php
    
    class Application_Validate_UserEmail_NotExists extends Zend_Validate_Abstract
    {   
        const REGISTERED_USER_EMAIL = 'invalid';
        const REGISTERED_USER_EMAIL_MESSAGE = 'Email already registered';
    
        protected $_messageTemplates = array(
            self::REGISTERED_USER_EMAIL => self::REGISTERED_USER_EMAIL_MESSAGE,
        );
    
    
        public function isValid($value)
        {   
    
    
            $modelUsers = new Model_Users();
            $user = $modelUsers->fetchRegisteredWithEmail($value);
    
            if (is_object($user)) {
                $this->isAlreadyRegisteredError = true;
                $this->_error(self::REGISTERED_USER_EMAIL);
                return false;
            }
    
            return true;
        }
    
    }
    
    
    $validator = new Application_Validate_UserEmail_NotExists();
    if ($validator->isValid('email@domain.com')) {
        ....
    }
    

    要检查用户是否登录,您应该使用Zend_Auth,它提供了多种功能来处理用户身份验证和会话管理。

    【讨论】:

    • 首先,感谢您的回答。我已经知道 Zend_Validate 和 Zend_Auth,但是例如对于客户,我会将 Zend_Auth 封装在 getLogged() 和 isLogged() 方法中。我认为直接在控制器中调用 Zend_Auth 并不好,因为我可能不仅需要 Zend_Auth 用于客户,还需要其他类型的身份验证。那么,您认为在Model_Customer中实现“fetchByEmail”、“isLogged”和“getLogged”是否有效?
    猜你喜欢
    • 2013-03-14
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2019-03-04
    • 2012-03-06
    相关资源
    最近更新 更多