开发Codeigniter游戏

Org*_*cat 6 php oop codeigniter content-management-system

我在PHP方面有相当多的经验(大约5年的一些网站制作经验和两个浏览器游戏).这是我第一次真正搞乱核心引擎,而不仅仅是像Joomla那样开发插件或模块.我在其他面向对象语言(例如Java)方面拥有丰富的经验.

我的问题是,我发现自己开发的网站很像普通网站,但我希望它比这更灵活,我不确定我"做得对".在某种程度上,我觉得我正在构建一半的CMS.

例如,我通过控制器设置主页面,控制器控制当前显示的视图.主视图页面如下所示:

<?php $this->load->view("headerview"); ?>
<?php $this->load->view($contentview); ?>
<?php $this->load->view("footerview"); ?>
Run Code Online (Sandbox Code Playgroud)

在视图文件本身(所以我可以动态加载内容视图,其他人不会真正改变).这是我的第一个问题,因为我通过我的主控制文件完成所有控制,这是正确的吗?

我的索引函数将主视图设置为要加载"contentview"和"gameview"变量的视图.当"contentview"是游戏时,它有一个分割窗格,一个显示玩家统计数据等,另一个显示玩家当前所在的页面(商店,战斗,探索世界等).决定这里显示的内容的是"gamecontent"变量(也在"主"控制器中传递).

<?php $this->load->view("menubar"); ?>
<?php $this->load->view($gamecontent); ?>
Run Code Online (Sandbox Code Playgroud)

简而言之,所有视图处理当前都在主控制器中完成,即一个控制器.

$data['title'] = "Experimental Page";
$data['maincontent'] = "gameview";
if($page == 1) {
    $data['gamecontent'] = "townview";
} else if ($page == 2) {
    $data['gamecontent'] = "merchantview";
} else if ($page == 3) {
    $data['gamecontent'] = "explorationview";
} else if ($page == 4) {
    $data['gamecontent'] = "hospitalview";
} else if ($page == 5) {
    $data['gamecontent'] = "fightview";
} else if ($page == 6) {
    $data['gamecontent'] = "adminview";
}

$this->load->helper(array('form','url'));
$this->load->library('form_validation');
$this->load->view('mainview', $data);
Run Code Online (Sandbox Code Playgroud)

我还没有开始添加战斗和购物功能,但我可以看到这个控制器变得非常大,非常快.这对我来说似乎不对,但不知怎的,我无法制定如何正确安排核心设置.

我的目标是(希望)拆分控制器,以便每个控制器处理一个单独的游戏功能,如治疗,战斗,探索等,并且分离很像我的模型(用户,怪物,物品等).

任何人都可以帮我弄清楚如何正确安排这个项目?

El *_*obo 4

我使用Symfony 事件调度程序组件来做这样的事情;该组件可以在不使用 Symfony 框架的情况下安装,因此您可以将其与 CodeIgniter 一起使用,但可能已经有类似的东西可供您使用;我不知道 CodeIgniter。

事件调度程序是观察者模式的通用实现。

  • 我有一个模块列表,这些模块将自己注册为它们处理的任何操作的观察者
  • 每个请求都会经过一个操作(例如“townview”)
  • 我的控制器只是创建一个事件,以任何操作作为名称;然后,事件调度程序系统找到任何声称能够处理该操作的模块,并将控制权交给它们

这样,无论你有多少动作,主控制器都不必改变;它只是创建一个事件并通过调度程序将其抛出;如果不处理它,它会抛出一个巨大的错误(在 DEV 中)或一个不错的错误(在 PROD 中)。

这在我们的应用程序中特别有用,因为我们有许多可选组件可以为不同的用户/客户端打开或关闭;控制器中根本没有复杂的逻辑,如果没有为客户端启用模块,我只是不注册这些模块。