结构CodeIgniter应用程序

时间:2010-01-12 09:56:32

标签: codeigniter refactoring

编辑:

使用CodeIgniter构建复杂应用程序的最佳方法是什么?为了使这个问题更具体,可能只关注结构化控制器:如果你有一个Users控制器,那么所有函数都应该在这个文件中吗?换句话说,您可能具有与特定视图相关联的控制器操作,但也有一堆辅助函数。

原始问题:鉴于复杂的应用程序,对于用户,交易,产品,为每个应用程序设置一个控制器是否有意义?既然每个都对应一个数据库表,那么每个数据库表都有相应的模型?我认为确实如此,但我目前正在开发的应用程序包括一个3000线控制器和一个3000线模型。只想验证有关CI和应用程序结构的标准做法。

4 个答案:

答案 0 :(得分:3)

我想在这里分享我的申请结构。

我从模特开始。我在mysql数据库中为一个表写了1个模型。我已将MY_Model类放入system/application/libraries/文件夹中。此课程包含get_detailget_listget_totalget_allinsertupdatedelete方法。我将表名存储在var中,所以基本上我只需要在模型中使用这个代码就可以使它工作:

class Some_table_model extends MY_Model {
  function Some_table_model()
  {
    $this->tablename = 'some_table';
    $this->primary_key = 'id';
  }

}

更新:在更多项目之后,我添加了新的var来保存表中用于主键的列名。这样,我就可以通过不对MY_Model中的主键的列名进行硬编码来获得更大的灵活性。

对于控制器,我根据用户的使用情况创建它。产品示例,我将拥有此控制器:

function Product extends Controller {
  function index()
  {
    //display product list, paginated
  }
  function admin()
  {
    //protected by session
    //display product list for admin, paginated
    //handle POST request to delete a product or products
  }
  function form()
  {
    //protected by session
    //handle add/edit product for admin
  }
}

视图与控制器有关。对于上面的控制器,我将至少有3个视图文件:

product_list.php
product_admin.php
product_form.php

视图可以放在subdir中,例如,我可以这样安排:

system/application/views/front/product.php
system/application/views/admin/product_list.php
system/application/views/admin/product_form.php

如果产品有类别,我需要另外一个表和模型,但是对于控制器,我可以通过在功能名称中添加类别将页面放在产品控制器中:

function category_admin()
{
  //get parameter
  //...
  //process data
  //...
  //redirect or load view
  //...
}

function category_form()
{
  //get parameter
  //...
  //process data
  //...
  //redirect or load view
  //...
}

这就是我的工作,这对我有用。希望这有助于您找到更好的方法来重构CodeIgniter的代码。

答案 1 :(得分:0)

应该分开控制器。但是如果不使用路由器来改变它,控制器也会更改URL。

对于Model,我通常将1个控制器映射到1个模型,如果DB的成本超过4行。

答案 2 :(得分:0)

首先,模型肯定需要分离:

user_model:
 add_user();
 delete_user();
 ...

products:
 add_product();
 delete_product();
 ...

transaction:
 ...
 ...

你应该明白这一点。

控制器也可以进行一些分离。我在这种情况下的控制器将是。

products:
 add_product();
 show_product();
 get_product();
 ...

users: 
 add_user();
 delete_user();
 ...

等等。 在控制器和模型中重复相同功能的原因是,您可以轻松地更改模型以访问不同的数据库/数据源,除了需要更改之外的任何内容。

此外,例如,在添加用户时,无需加载产品型号。

答案 3 :(得分:0)

如果您真的关心项目组织,请查看Matchbox

来自Matchbox文档:

  

Matchbox是一组扩展库,可让您在小型组件(模块)中组织应用程序。这些模块有几个优点,主要是便携性。模块存储在自己的文件夹中,因此可以在其他应用程序中重复使用,也可以通过仅复制一个文件夹在用户之间共享。

这使您可以通过将相关模型和控制器放在同一文件夹中来真正组织您的内容。

相关问题