在CodeIgniter中合并类/控制器/库的正确方法是什么?

时间:2013-11-10 12:40:22

标签: php codeigniter oop

我是Codeigniter的新手,虽然我有大约2年的PHP经验。我已经完成了Codeigniter文档,我已经创建了一些简单的例子,但是现在我正在进行一个实际的项目,我想确保我从正确的方向下来。

问题在于:我正在构建一个单页游戏应用程序,在该页面上会有很多动态/数据库数据。我已经为页面创建了一个控制器和视图,到目前为止,这一切都非常简单:

//controller (application/controllers/main.php)
class Main extends CI_Controller {

    public function index()
    {
            $this->load->model('Model');        //load DB abstraction model
            $this->load->helper('url');     //load URL helper (base_url() function etc)

            $data = array("somestuff","otherstuff");//some general data for the page

        $this->load->view('header');
        $this->load->view('mainview', $data);
        $this->load->view('footer');
    }   
}

//view (application/views/mainview.php)
<div id="container">
    <div id="tab1">
        some data related to logged in user
    </div>
    <div id="tab2">
        some data related to game
    </div>
</div>

现在,您可以看到,我们可以将应该在页面上显示的数据拆分为两组 - 用户数据和应用程序数据。自然的OOP方法是:

1)创建一个User类并使用其中的函数来获取和显示用户数据(因为我们正在使用MVC,所以加载模型)

2)创建一个或多个与游戏相关的类,并使用它们来计算和显示当前游戏数据

为简单起见,我们假设我只需要一个游戏类。

我遇到的问题是我想到了正确的CodeIgniter方法。用户指南提到用户创建的库,用户创建的控制器和用户创建的类。这些库对我来说是一个令人困惑的概念,因为我不明白它们如何在这里产生影响。

因为我已经有一个页面控制器(我认为这也是一种自然的方法,但如果我错了请纠正我),我如何整合用户/游戏类?我有一些具体的问题可以帮助我直截了当地解决这个问题。

1)User / Game应该是扩展CI_Controller的新控制器吗?

2)类应该放在“libraries”目录中还是直接放在控制器中?

3)他们与主控制器有什么关系(假设我在创建它时是正确的)?

2 个答案:

答案 0 :(得分:1)

我给你一些线索。

根据我的经验和我所看到的:

控制器在提供文本,json,html等格式化数据时使用 或者在接收输入并重定向到其他页面时使用 控制器可以使用其他方法使用的一些私有方法来格式化或检查某些数据。

库可以在控制器和模型之间架起桥梁 它们可以与模型或其他库一起使用,也可以只使用本机PHP 通常,库使用控制器接收的数据,并在检查或使用它们之后将它们传递给模型。

库也可以是表示实体的类,您必须像$Obj = new SomeObject()那样实例化(您必须包含类文件)。
在这种情况下,不使用Singleton模式。

  • 因此,如果您的控制器收到输入credit_brought
  • 检查credit_brought是否为数字(eventualy)
  • 它调用正确的类方法$User->add_credit()
    • 如果credit_brought不是数字
    • ,该方法可能会引发异常
    • 它可以做一些检查,例如“这个用户是否获得足够的信用额度”
    • 该方法可以调用模型$this->user_model->add_credit()
      • 进行SQL查询,例如:$this->db->set('credit', 'credit +'.$credit, FALSE)->where('id', $userid)->update('users')
  • 完成所有操作后,$User->add_credit()会向控制器返回一些响应(在这种情况下为bool)
  • 控制器将适当的数据返回给客户端(view或ajax response或..)

我不确定我的英语能不好......

在CI文档中,阅读您可以在目录中找到的简介常规主题页面

如果您发现任何拼写错误,请纠正我。

答案 1 :(得分:1)

我认为最好将游戏和用户控制器分开,因为它们代表不同的资源。但要用子弹回答你的问题:

  1. 是UserController和GameController应该扩展CI_Controller,以便能够响应来自前端控制器的传入请求。
  2. 默认情况下,它们位于controllers文件夹中。
  3. 好吧,MainController的index()方法创建了JS对象,它们将使用AJAX请求与UserController和GameController方法进行交互。