Zend Framework - обрабатывать приложение с пользователями и участниками - PullRequest
1 голос
/ 27 марта 2012

Мне было интересно, как обрабатывать отдельно пользователей и участников в приложении, где все зарегистрированные пользователи считаются пользователями , а пользователи, имеющие команду, считаются участниками . Другие пользователи гость .

По сути, простой пользователь может найти команду, получить запрос команды и т. Д. Участник может посмотреть профиль своей команды, увидеть других участников и сделать много других вещей относительно членов и его команды.

В настоящее время пользователи, члены и команды работают в трех разных классах, каждый из которых представляет структуру таблицы базы данных.

Итак, у меня есть 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.
    ..........
}

Как видите, этот класс очень "прилипает" к полям моей базы данных, хотя я не знаю, является ли это лучшим способом сделать это.

Модель «Мои члены» в основном та же самая, за исключением того, что она представляет таблицу «team_users» и не имеет методов set / getMembers, но имеет методы относительно членов.

Теперь вы понимаете, насколько сложно управлять такими вещами, каждый раз, когда я хочу получить участника, мне нужно проверить, есть ли у пользователя команда, если да, я создаю экземпляр участника, используя getMember(), и т.д.

Со стороны участника трудно получить информацию о члене, такую ​​как его first_name, мне всегда нужно проверять user_id, создавать пользовательский экземпляр и получать его first_name.

Как я могу справиться с такими вещами? Я подумал, может быть, моя модель Member должна просто расширять модель Users, так как участник также является пользователем? Это хорошая идея? Как бы вы это сделали?

Спасибо.

1 Ответ

1 голос
/ 27 марта 2012

Смоделируйте все как есть, независимо от того, как структурирована ваша база данных - в большинстве случаев это будет работать лучше.

  • Поскольку пользователь является пользователем определенного типа, класс Member должен расширять класс User.
  • Только класс Member должен иметь метод getTeam (), поскольку только члены имеют команду, а обычные пользователи - нет.

Я не думаю, что действительно есть прекрасное решение, чтобы справиться с вашей конкретной ситуацией. Но как насчет этого?

$user = new User($data, $gateway);
if ($user->hasTeam()) {
    $user = Member::fromUser($user); // returns a new instance of 'Member'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...