Zend Framework - 处理用户和成员的应用程序

时间:2012-03-27 17:04:27

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

我想知道如何在一个应用程序中单独处理用户和成员,其中所有注册用户都被视为用户,拥有团队的用户被视为成员 。其他用户是来宾

基本上,一个简单的用户可以找到一个团队,收到一个团队请求等。一个成员可以看到他的团队资料,看到其他成员,并做了很多相对于成员和他的团队的事情。

目前,用户,成员和团队处理三个不同的类,它们都代表了他们的数据库表结构。

所以我的数据库中有3个表如下:

MySQL Workbench

我举例来说这个类代表一个用户:

class Lib_Model_Users_User implements Zend_Auth_Adapter_Interface, Zend_Acl_Role_Interface
{
    protected $_gateway;
    protected $_roleId;

    protected $_member = null;
    protected $_team = null;

    protected $_data = array(
        'user_id'       => null,
        'email'         => null,
        'password'      => null, 
        'first_name'    => null, 
        'last_name'     => null,
        'gender'        => null,
        'address'       => null,
        'city'          => null,
        'country'       => null,
        'postal_code'   => null, 
        'phone_mobile'  => null,
        'phone_home'    => null,
        'date_of_birth' => null,
        'occupation'    => null,
        'active'        => false,
        'created_on'    => null,
        'last_login'    => null,
        'last_update'   => null);

    public function __construct($data, $gateway)
    {
        $this->setGateway($gateway);
        $this->populate($data);

        if (!isset($this->user_id)) {
            if (!isset($this->email)) {
                if (!isset($this->first_name, $this->last_name))
                    throw new Lib_Exception('Initial data must contain an email or a user id or a pair firstname/lastname');
            }
        }
    }

    public function setMember($data)
    {
        $gateway = new Lib_Model_Teams_Gateway();
        $this->_member = $gateway->createMember($data);
    }

    public function getMember($status = 'active')
    {
        if (null === $this->getTeam()) {
            return null;
        }

        if (null === $this->_member) {
            $this->_member = $this->getTeam()->getMember($this->user_id);
        }

        if (is_string($status)) {
            $status = array($status);
        }

        foreach ($status as $state) {
            if ($this->_member->status == $state) {
                return $this->_member;
            }
        }
        return null;
    }

    public function getTeam($active = true)
    {
        if ($this->_team === null) {
            $this->_team = $this->getGateway()->fetchTeam($this->user_id, $active);
        }
        return $this->_team;
    }

    public function save()
    {
        $gateway = $this->getGateway();
        $dbTable = $gateway->getDbTable();
        $row = $dbTable->find($this->user_id)->current();
        if ($row) {
            foreach ($this->_data as $key => $value) {
                $row->$key = $value;
            }
            return $row->save();
        }
        $this->user_id = $dbTable->insert($this->_data);
        return $this->user_id; 
    }

    public function getRoleId()
    {
        if (null === $this->_roleId)
            $this->_roleId = $this->user_id;
        return $this->_roleId;
    }

    ..........
    // etc.
    ..........
}

正如你所看到的,这门课非常“坚持”#34;在我的数据库字段中,我不知道它是否是最好的方法。

我的会员模型基本上是相同的,除了它代表" team_users"表,它没有set / getMembers方法,但有相对于成员的方法。

现在,您了解管理这样的事情是多么困难,每次我想要成员时,我都需要检查用户是否有团队,如果是,我使用{{1}创建成员实例等等。

从会员方面来说,很难获得有关其getMember()等成员的信息,我总是需要检查first_name,创建用户实例并获取他的{ {1}}。

我该如何处理这类事情?我想也许我的会员模型应该扩展用户模型,因为会员也是用户?这是个好主意吗?你会怎么做?

谢谢。

1 个答案:

答案 0 :(得分:1)

按照事物的方式对其进行建模,无论数据库的结构如何 - 在大多数情况下都会发挥最佳效果。

  • 由于成员是某种类型的用户,因此Member类应扩展User类。
  • 只有会员类应该有一个方法getTeam(),因为只有成员才有团队而普通用户没有。

我认为没有一个漂亮的解决方案来处理您的确切情况。但是这样的事情呢?

$user = new User($data, $gateway);
if ($user->hasTeam()) {
    $user = Member::fromUser($user); // returns a new instance of 'Member'
}