代码之家  ›  专栏  ›  技术社区  ›  rg88

Zend框架中的模型

  •  32
  • rg88  · 技术社区  · 16 年前

    您在Zend框架中实现模型的一些方法是什么?

    我看过基本的 class User extends Zend_Db_Table_Abstract 然后在控制器中对其进行调用:

    $foo = new User;

    $foo->fetchAll()

    但是更复杂的用途呢?文档的快速入门部分提供了这样一个示例,但我仍然觉得我没有得到Zend Framework中模型的“最佳使用”示例。有什么有趣的实现吗?


    编辑:

    11 回复  |  直到 13 年前
        1
  •  61
  •   Bill Karwin    13 年前

    我为Zend工作,在Zend_Db_表组件上做了很多工作。

    Zend框架没有就领域模型模式的“模型”概念提供很多指导。模型没有基类,因为模型封装了特定于应用程序的部分业务逻辑。我写了一封信 blog 更详细地讨论这个问题。

    对数据库的持久性应该是模型的内部实现细节。模型通常 使用 一张或多张桌子。将模型作为表的扩展来考虑是一种常见但不合适的面向对象设计。换句话说,我们应该说模型有一个表,而不是模型是一个表。

    class MyModel extends Zend_Db_Table_Abstract
    {
    } 
    

    这是HAS-A的一个示例:

    class MyModel // extends nothing
    {
        protected $some_table;
    }
    

    在实际域模型中,您将 使用 $MyModel方法中的一些表。

    你也可以阅读马丁·福勒的《对未来的看法》 Domain Model Anemic Domain Model

        2
  •  23
  •   Community dbr    7 年前

    我个人认为这两个都是子类 Zend_Db_Table_Abstract Zend_Db_Table_Row_Abstract . 我的代码和你的代码之间的主要区别是显式地处理 作为一张“桌子”和 Zend_Db_表格_行_摘要 像这样:

    class Users extends Zend_Db_Table_Abstract {
    
        protected $_name = 'users';
    
        protected $_rowClass = 'User'; // <== THIS IS REALLY HELPFUL
    
        public function getById($id) {
            // RETURNS ONE INSTANCE OF 'User'
        }
    
        public function getActiveUsers() {
            // RETURNS MULTIPLE 'User' OBJECTS            
        }
    
    }
    
    class User extends Zend_Db_Table_Row_Abstract {
    
        public function setPassword() {
            // SET THE PASSWORD FOR A SINGLE ROW
        }
    
    }
    
    /* CONTROLLER */
    public function setPasswordAction() {
    
        /* GET YOUR PARAMS */
    
        $users = new Users();
    
        $user = $users->getById($id);
    
        $user->setPassword($password);
    
        $user->save();
    }
    

    有很多方法可以做到这一点。不要认为这是唯一的一个,但我试图遵循采埃孚的设计意图。(以下是我的更多信息 thoughts and links on the subject )这种方法确实有点重,但我觉得它让控制器专注于处理输入并与视图协调;让模型做特定于应用程序的工作。

        3
  •  7
  •   smack0007    16 年前

    here 对于一个允许您在某种程度上结合“Model”类和Zend_Db_表的hack。

    最重要的一点是,当您在控制器中直接使用Zend_Db_表时,您最终会在多个位置执行相同的操作。如果你必须改变某些逻辑,你必须在多个地方做出改变。不好的。我的第一个专业项目就是这样完成的,因为我是公司里必须学习如何使用采埃孚的人,现在真是一团糟。

    我还倾向于将助手函数写入类中,以进行复杂的获取。像$table这样的东西->doNameFetchAll()或$table->doOrderFetchAll()。

        4
  •  7
  •   ironkeith    15 年前

    我一直在对采埃孚的模型进行研究,发现了Matthew Weier O'Phinney的一系列有趣的文章,非常值得一看:

        5
  •  5
  •   d-_-b    14 年前

    一个模型 . 如果我从RSS提要或SOAP服务获取数据,或者从FS读取文件,该怎么办?

    不扩展任何内容 . 我将要编写一个使用其他模型方法的模型。

        6
  •  3
  •   chroder    16 年前

    对于模型部分,跳过ZF,有更好的解决方案。采埃孚“MVC”中的“M”几乎不存在。阅读他们的文档时,他们根本没有提到模型——这是一件好事,这意味着你可以使用任何你想要的东西,而无需编写大量的适配器代码。

    Doctrine 取而代之的是模型。它正迅速成为PHP事实上的ORM。

        7
  •  1
  •   Christian C. Salvadó    16 年前

    您可以执行更复杂的查询,检查 Advanced usage Zend_Db_Table 手册页。

    $select = $table->select();
    $select->from($table,
                  array('COUNT(reported_by) as `count`', 'reported_by'))
           ->where('bug_status = ?', 'NEW')
           ->group('reported_by');
    
        8
  •  1
  •   farzad    16 年前

    您可以扩展Zend_Db_Table_抽象类并向其添加一些有用的方法。例如,您可以将changePassword()方法添加到用户类中并操作其数据。或者,您可以更改类的默认_-toString()方法,这样您就有了一个自定义的_-toString()方法,可以用格式良好的字符串返回用户的全部联系信息(姓名、地址、电话号码)。在构造函数中,您可以将数据填充到对象的属性中。然后像这样使用它们:

    public function __toString() {
       $data = $this->_name . ', ' . $this->_adderss . ', call: ' . $this->_phone;
       return $data;
    }
    

        9
  •  1
  •   troelskn    16 年前

    数据库实体不是模型组件的唯一类型。因此,谈论模型(复数形式)是没有意义的——您的应用程序 Zend_Db ),而其他人则不会。

    我建议你去拿这本书 Domain Driven Design 作者Eric Evans,在解释如何构建对象模型方面做得很好。

        10
  •  1
  •   lo_fye    15 年前

    我使用Propel 1.3而不是Zend_Db_表。 它可以检查您的数据库并自动生成所有模型。

    第1级:基本模型和;BasePeer:每次重新生成ORM时,这些都会被覆盖。i、 e.BaseUser.php&BaseUserPeer.php

    第二级:StubModel&StubPeer:这些不会被覆盖。它们是你定制的。i、 e.User.php&UserPeer.php

    类型2:对等-用于查询。这些是静态对象。i、 e.UserPeer.php

    $derek = new User();
    $derek->setFirstName('Derek');
    $derek->save();
    

    要查找所有德里克:

    $c = new Criteria();
    $c->add(UserPeer::FIRST_NAME, 'Derek');
    $dereks = UserPeer::doSelect($c);
    
        11
  •  1
  •   sunwukung    14 年前

    http://zfsite.andreinikolov.com/2008/08/zend_db_table-time-overhead-about-25-percents/

    Zend_表原则上很好,但会产生一些性能开销(没有缓存)。。。