有关DataMapper中自定义模型方法的问题

时间:2011-02-11 18:49:28

标签: php codeigniter datamapper

我最近决定在我的CI应用程序中实现DataMapper,到目前为止效果很好。关于自定义模型方法的使用,我有几个问题。假设我想在登录我的应用程序时更新用户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和用户之间的关系在名为cookies_users的表中定义。我想我可以在我的'cookie'模型中创建一个名为setCookies的方法,并允许两个参数, sid pid ,但是我如何使用已经在该方法中建立用户模型,是否将其传递给方法?阅读DataMapper我不太相信是否建议在控制器中抛出所有逻辑并尽可能保持模型清洁,或者是否可以使用自定义方法打包模型。有谁知道这个上下都是什么?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

关于Codeigniter的好处在于它对你的模型或控制器中的内容很灵活(从技术上讲,你可以完全放弃模型,但这种做法违背了MVC的目的)。关于“胖模型,瘦控制器与胖控制器,瘦模型”的争论存在不同的思想流派,但我个人的偏好是在模型中拥有所有直接数据库访问,实质上是扩展DataMapper。但是,我发现,如果你通过DataMapper利用可用的函数,你通常不需要添加很多自定义函数(一般来说,我最终只有大约六个,其中大多数都是just complex选择,验证或调用API的JSON编码,这些编码可能会在其他控制器中重复使用。)

如果通过对象调用模型函数,则应该能够使用$this来访问已建立的对象。从那里,您可以根据需要执行自定义内容。

因此,例如,您的控制器中可能有$cookie->setCookie($sid, $pid),而您的模型中可能有(代码未经过测试,只是一个示例):

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

您在模型中拥有的内容在很大程度上取决于您要完成的任务,以及您尝试完成的内容是否可以通过DataMapper本地完成。对于基本的CRUD和关系,我通常最终只得到控制器中的对象。

另外,还有许多处理会话的身份验证库。如果您正在尝试构建身份验证系统,可能需要考虑将其检出。