【问题标题】:Object oriented schemes for CodeigniterCodeigniter 的面向对象方案
【发布时间】:2012-06-17 04:09:27
【问题描述】:

我想明确这一点。我正在使用 codeigniter。

在构建 Web 应用程序的 codeigniter 中,什么/哪种方式更好/合适/标准/最受赞赏的 OOP 设计?

一般来说

我。 创建一个像 User 这样的自定义类并具有登录功能? 比如,

     class User{ 
            var $db, $id, $username, $password, $role; //have all user attributes here

            function __construct() {
               //instance for accessing the database
               $this->db =& get_instance();
            }

            public function login(){
                //do the login here
                $this->db->load->model('user_model');   
                $success = $this->db->user_model->login($this->username, $this->password);      
                //isn't this redundant using models? or should I rename the model function name like checkLogin?
                return $success;
            }

            //other class functions 
        }

二。 直接从控制器调用模型中的登录函数而不创建用户对象?

O_o

在方案 1 中,我使模型仅在数据库中进行查询。 我还可以让“用户”对象像“客户”、“管理员”一样被继承,并为每个对象添加特定功能。我的优势是让 CI 控制器专注于布局和将变量传递给视图,这主要是它的目的(不太确定),并让我的自定义类/对象处理我的 Web 应用程序中的操作。 但是我觉得我的登录功能有冗余,我在模型中调用了另一个登录功能。这样好吗?

在方案 2 中,让我的控制器处理所有操作,如登录、注册或创建日志并接收输入帖子并将变量传递到视图是否合适?

我真的需要一些指导。 我的 OO 技能需要提高。

非常感谢!

【问题讨论】:

  • 感谢您的所有回答。 @painkiller,是的,我已经在使用 PhpActiveRecord 将我的数据库映射到我的模型。我正在用 Bonfire 做这个。

标签: php oop codeigniter object


【解决方案1】:

首先,我认为阅读这篇文章会对您有所帮助:

Access Control List

我现在正在开发一个使用 CodeIgniter 的项目,我们在这里使用的方法可能也适合您。如果您需要检查授权,我认为最好的地方是在类的构造函数中,如果用户尚未注册,则调用登录函数。但这是一种有点通用的方法,所以如果你有一些函数应该只对注册用户可用的类,那么你应该在函数内部进行检查。

【讨论】:

  • 感谢您的回答。我真正关心的不是登录功能,而是如何在 Codeigniter 中实现 OO。
  • 也许我没有让你的问题正确,我正在和你一样学习,但我会提到一些我在使用 CI 时学到的东西。最重要的是 - 它是基于 MVC 的框架,因此它在某种程度上迫使您编写正确的 OO 代码。包括数据在内的所有操作都应在模型中完成。数据可以是任何东西——从表单收集的信息到文件和流。如果控制器中的当前函数需要某种类型的用户,您应该调用模型来检查并从那里获取结果。您可以在控制器中执行此操作,但这不是 CI 的 MVC 模式中的想法。
  • 是的,我知道 MVC 是面向对象的。这就是我的想法。 1 - 最好有一个像“用户”这样的对象。到那时,您可以使其成为对象“客户端”和“管理员”的父对象,以便您还可以专门为子对象自定义或添加功能。例如,'Admin' 可能有一个函数 viewClientLogs() 或 changeTemplateFile() 记住它从对象 'User' 继承也有一个用户名和密码。所以在我的管理员/登录(控制器/操作)中,我不会重新编写登录脚本,我只会使用 $admin = new Admin; $admin->登录();并重定向到管理仪表板。
  • 2- 我想让控制器处理对象实例,在调整模板和视图位置时使用简单的逻辑将变量传递给视图(反之亦然)。 3 - 模型应该只在数据库中查询。这些想法与模型可以充当对象(我的网络应用程序中的真实对象,如“用户”)相矛盾。我的意思是我们可以为模型设置属性,比如 $user_model->username??我对这些部分感到困惑。我正在寻找事实上的方式。很抱歉这个喧嚣的问题。 T_T
  • 好吧,对不起,但我认为我们是从两个不同的角度来看的。我认为这可以参考控制反转模式。在我看来,您根本不需要 user 课程。您可以使用会话来操纵用户,我认为拥有像$_SESSION['user_role'] 这样的标志会更好、更容易,也许两者兼而有之。这样,每当您调用只有特定用户才能访问的函数时,您只需检查用户角色 - 管理员、客户,然后决定要做什么。
【解决方案2】:

如果你真的想遵循严格的 OO 模型,你应该考虑使用 DataMapper。许多人会说它会减慢应用程序的速度,这是真的,但这是您为完整的 OO 付出的代价。您可以做的是创建一个 User 类来处理所有数据操作并将登录移动到 Auth 库,这将与您的 User 模型一起使用。请记住,模型使用/执行数据操作控制器存储业务逻辑。我也在学习,希望这篇文章对您有所帮助。

【讨论】:

    【解决方案3】:

    如果该模型将被使用更多次,创建一个对象并在构造函数中加载模块总是一个好主意。

    但我不建议你在构造函数中使用$this->db =& get_instance();。这应该已经自动加载了。

    【讨论】:

    • 如何自动加载get_instance函数?
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2011-11-05
    • 2014-08-24
    相关资源
    最近更新 更多