Вопросы, касающиеся пользовательских методов модели в DataMapper

Недавно я решил внедрить DataMapper в свое CI-приложение, пока оно отлично работает. У меня есть пара вопросов, касающихся использования пользовательских методов модели. Допустим, я хочу обновить файлы cookie пользователя, когда он входит в мое приложение. Мой контроллер выглядит примерно так (я исключил определение класса):

        if(isset($_POST['login_rememberme']) && $_POST['login_rememberme'] == TRUE)
        {
            // There's already a user object defined here called $user

            // Create two new random cookies
            $pid = rand_str(40);
            $sid = rand_str(40);

            // Set the cookies in the users browser
            setcookie('pid', $pid, COOKIE_EXPIRE, '/', FALSE, '', TRUE);
            setcookie('sid', $sid, COOKIE_EXPIRE, '/', FALSE, '', TRUE);

            // Update users relationsship with the new cookies in the db
            ???
        }

Файлы cookie хранятся в отдельной таблице от пользовательских данных (пароль, электронная почта и т. д.). Отношения между файлами cookie и пользователями определяются в таблице cookie_users. Я думаю, что я мог бы создать метод в моей модели cookie с именем setCookies и разрешить два параметра, sid и pid, но тогда как мне использовать уже установленная пользовательская модель в этом методе, передать ли ее методу? Читая DataMapper, я не совсем уверен, рекомендуется ли бросить всю логику в контроллер и сохранить модели в чистоте, насколько это возможно, или можно ли упаковать ваши модели с помощью пользовательских методов. Кто-нибудь знает, что вверх и вниз в этом?

Спасибо за ваше время.


person soren.qvist    schedule 11.02.2011    source источник


Ответы (1)


Преимущество Codeigniter в том, что он гибко подходит к тому, что входит в ваши модели или контроллеры (технически вы можете вообще отказаться от моделей, но это противоречит цели MVC). Существуют разные точки зрения на дебаты «толстая модель, тонкий контроллер против толстого контроллера, тонкая модель», но я лично предпочитаю иметь прямой доступ к базе данных в моделях, по существу расширяя DataMapper. Однако я обнаружил, что вам, как правило, не нужно добавлять множество пользовательских функций, если вы используете функции, доступные вам через DataMapper (обычно у меня получается около полдюжины, и большинство из них просто сложные выборки, проверка или вызовы кодирования JSON для API, которые могут быть повторно использованы в других контроллерах).

Если вы вызываете функции модели через объект, вы должны иметь возможность использовать $this для доступа к установленному объекту. Оттуда вы можете выполнять свои собственные действия по мере необходимости.

Так, например, у вас может быть $cookie->setCookie($sid, $pid) в вашем контроллере и в вашей модели (код не тестировался, просто пример):

function setCookie($sid, $pid){
  $this->pid = $pid;
  $this->sid = $sid;
  // Do other custom stuff.
  return $this->save();
}

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

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

person Shauna    schedule 16.02.2011