Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在CodeIgniter中合并类/控制器/库的正确方法是什么?_Php_Codeigniter_Oop - Fatal编程技术网

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

Php 在CodeIgniter中合并类/控制器/库的正确方法是什么?,php,codeigniter,oop,Php,Codeigniter,Oop,我是一名Codeigniter新手,尽管我有大约2年的PHP经验。我已经阅读了Codeigniter文档,并创建了一些简单的示例,但现在我要进入一个实际的项目,我想确保我的工作进展顺利 问题是:我正在构建一个单页面的游戏应用程序,在该页面上将有大量的动态/DB数据。我已经为页面创建了一个控制器和视图,到目前为止都非常简单: //controller (application/controllers/main.php) class Main extends CI_Controller {

我是一名Codeigniter新手,尽管我有大约2年的PHP经验。我已经阅读了Codeigniter文档,并创建了一些简单的示例,但现在我要进入一个实际的项目,我想确保我的工作进展顺利

问题是:我正在构建一个单页面的游戏应用程序,在该页面上将有大量的动态/DB数据。我已经为页面创建了一个控制器和视图,到目前为止都非常简单:

//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>
//控制器(application/controllers/main.php)
类Main扩展CI_控制器{
公共职能指数()
{
$this->load->model('model');//加载数据库抽象模型
$this->load->helper('url');//加载url helper(base_url()函数等)
$data=array(“somestuff”,“otherstuff”);//页面的一些常规数据
$this->load->view('header');
$this->load->view('mainview',$data);
$this->load->view('footer');
}   
}
//视图(application/views/mainview.php)
一些与登录用户相关的数据
一些与游戏相关的数据
现在,您可以看到,我们可以将页面上应该显示的数据分为两组—用户数据和应用程序数据。自然的OOP方法是:

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

2) 创建一个或多个游戏相关类,并使用这些类计算和显示当前游戏数据

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

我遇到的问题是,如何正确使用CodeIgniter方法。《用户指南》提到了用户创建的库、用户创建的控制器和用户创建的类。图书馆对我来说是一个有点混乱的概念,因为我不明白它们是如何在这里产生影响的

由于我已经有了一个页面控制器(我认为这也是自然的方法,但如果我错了,请纠正我),我如何集成用户/游戏类?我有几个具体的问题,可以帮助我把这件事想清楚

1) 用户/游戏应该是扩展CI_控制器的新控制器吗

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

3) 他们应该与主控制器有什么关系(假设我一开始创建它是正确的)?

我给你一些线索

根据我的经验和所见:

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

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

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

  • 因此,如果您的控制器收到输入
    credit\u
  • 它检查所带来的
    credit\u
    是否是一个数字(最终)
  • 它调用适当的类方法
    $User->add_credit()
    • 如果
      credit\u
      不是一个数字,则该方法可能引发异常
    • 它可以做一些检查,比如“该用户是否能获得足够的学分?”
    • 该方法可以调用model
      $this->user\u model->add\u credit()
      • 要进行SQL查询,例如:
        $this->db->set('credit','credit+'。$credit,FALSE)->where('id',$userid)->update('users')
  • 完成所有操作后,
    $User->add_credit()
    向控制器返回一些响应(在这种情况下为bool)
  • 控制器将适当的数据返回给客户端(查看或ajax响应或..)
我不确定我的英语是否很差

在CI文档中,阅读目录中的介绍和一般主题


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

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

  • 是的UserController和GameController应该扩展CI_控制器,以便能够响应来自前端控制器的传入请求
  • 默认情况下,它们放置在控制器文件夹中
  • MainController的index()方法创建JS对象,这些对象将使用AJAX请求与UserController和GameController方法交互

  • 谢谢但我不确定我是否理解。让我们暂时不讨论客户端,假设没有AJAX,只有通过PHP生成并插入到模板中的所有数据。如果我创建两个新控制器,那么将它们与MainController关联的最佳方式是什么?我是否应该从主控制器内部以某种方式使用他们的方法?我不确定“关联”是什么意思。您能详细说明一下吗?对不起,我的意思是,在这个场景中,MainController应该能够使用UserController的方法,对吗?那么,我应该通过加载User类在MainController中创建$User对象,然后使用它吗?好的,我明白了。根据CI的设计,控制器的方法只应:1)通过显式调用Redirect()重定向,2)实例化模型和库类。控制器的方法设计为不能从除重定向()之外的其他控制器调用。例如,您可能希望将某个人从Admin::index()重定向到Main::index(),如果他们是