Php Zend Framework-处理具有用户和成员的应用程序
我想知道如何在一个应用程序中分别处理用户和成员,其中所有注册用户都被视为用户,拥有团队的用户被视为成员。其他用户是来宾 基本上,一个简单的用户可以找到一个团队,接收一个团队请求,等等。一个成员可以看到他的团队档案,看到其他成员,并做很多与成员和他的团队相关的事情 目前,用户、成员和团队被分为三个不同的类,它们都表示它们的数据库表结构 因此,我的数据库中有3个表,如下所示: 例如,我有一个代表用户的类:Php Zend Framework-处理具有用户和成员的应用程序,php,model-view-controller,zend-framework,model,Php,Model View Controller,Zend Framework,Model,我想知道如何在一个应用程序中分别处理用户和成员,其中所有注册用户都被视为用户,拥有团队的用户被视为成员。其他用户是来宾 基本上,一个简单的用户可以找到一个团队,接收一个团队请求,等等。一个成员可以看到他的团队档案,看到其他成员,并做很多与成员和他的团队相关的事情 目前,用户、成员和团队被分为三个不同的类,它们都表示它们的数据库表结构 因此,我的数据库中有3个表,如下所示: 例如,我有一个代表用户的类: class Lib_Model_Users_User implements Zend_Aut
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.
..........
}
正如您所看到的,这个类非常“坚持”我的数据库字段,但我不知道这是否是最好的方法
我的成员模型基本上是相同的,只是它表示“team_users”表,它没有set/getMembers方法,但有相对于成员的方法
现在,您知道管理这样的事情有多难了,每次我想要获得一个成员时,我都需要检查一个用户是否有团队,如果有,我使用getMember()
等创建一个成员实例
从成员方面,很难获得有关成员的信息,例如他的名字
,我总是需要检查用户id
,创建一个用户实例并获取他的名字
我怎么处理这种事情?我在想也许我的成员模型应该扩展用户模型,因为成员也是用户?这是个好主意吗?你会怎么做
谢谢。无论数据库的结构如何,都要按照事物的方式进行建模,这在大多数情况下都是最有效的
- 由于成员是某种类型的用户,因此成员类应该扩展用户类
- 只有成员类应该有一个方法getTeam(),因为只有成员才有团队,而普通用户没有
$user = new User($data, $gateway);
if ($user->hasTeam()) {
$user = Member::fromUser($user); // returns a new instance of 'Member'
}
无论数据库是如何构造的,都要按照事物的方式对其进行建模,这在大多数情况下都是最有效的
- 由于成员是某种类型的用户,因此成员类应该扩展用户类
- 只有成员类应该有一个方法getTeam(),因为只有成员才有团队,而普通用户没有
$user = new User($data, $gateway);
if ($user->hasTeam()) {
$user = Member::fromUser($user); // returns a new instance of 'Member'
}
不相关——你用什么建模软件创建了这个截图?啊,很好,从来没有试过。现在下载。谢谢不相关——你用什么建模软件创建了这个截图?啊,很好,从来没有试过。现在下载。谢谢谢谢,不过我还有一个问题。如何以及在何处确定应该实例化哪个类?我应该使用一个工厂,根据用户或成员的状态(是否在teamusers表中)创建用户或成员吗?这就是我想用我的示例说明的:我将始终创建一个用户实例,然后检查该用户是否有团队,如果有,将该用户实例转换为成员实例。感谢您的解释!!谢谢,不过我还有一个问题。如何以及在何处确定应该实例化哪个类?我应该使用一个工厂,根据用户或成员的状态(是否在teamusers表中)创建用户或成员吗?这就是我想用我的示例说明的:我将始终创建一个用户实例,然后检查该用户是否有团队,如果有,将该用户实例转换为成员实例。感谢您的解释!!