2010-01-12 115 views
1

编辑:结构CodeIgniter应用程序

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

原始问题:给定一个复杂的应用程序,与用户,交易,产品,是否有意义为每个人都有一个控制器?并且由于每个这些对应于一个数据库表,所以每个都有相应的模型?我认为它确实,但我目前正在使用的应用程序包含一个3000线控制器和一个3000线模型。只是想验证有关CI和应用程序结构的标准做法。

回答

3

我想在这里分享我的应用程序结构。

我从模型开始。我为mysql数据库中的一个表编写1个模型。我已经有MY_Model我放在system/application/libraries/文件夹中的课程。本课程有get_detail,get_list,get_total,get_all,insert,updatedelete方法。我存储在一个变种表名,所以基本上我只需要在模型这个代码,使其工作:

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

} 

更新:经过一些项目,我已经添加了新的变种持有使用的列名为表中的主键。这样,通过在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 
    } 
} 

查看与控制器有关。对于上述控制器,I将具有至少3视图的文件:

product_list.php 
product_admin.php 
product_form.php 

视图可以被放置在子目录,例如,我可以这样安排的:

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的代码。

+0

这是否假设你的所有主键都是'id'? – karlipoppins 2010-09-08 09:50:49

+0

最近我通过添加新的属性$ primary_key来更新MY_Model。该属性将保存表的主键列名称,默认值为'id'。通过这种方式,我可以灵活地处理使用'id'以外的列作为主键的表,例如'country_id'。 – 2010-09-12 12:51:58

+1

大多数这是一个好主意,但我通常避免混合管理员代码和前端代码。尽管大部分数据交互会相同或相似,但您必须记住,控制器中的代码越多,代码越慢。 PHP不需要为每个前端用户解析所有不相关的管理代码来查看您的网站。 – 2010-09-13 13:09:22

0

应该单独控制器。但是如果您不使用路由器来更改它,控制器也会更改网址。

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

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(); 
... 

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

此外,当您添加用户时绝对不需要加载产品型号。

+1

在我的角度来看,一流的产品的方法并不需要‘_产品’,如$产品 - >添加()就足够了,$产品 - > add_product()被重复自己。 – joetsuihk 2010-01-13 01:44:29

+0

我开始“_产品”公约很久以前的一个项目,我愿意付出一切回去。它结束了很多额外的打字。 – Zack 2010-01-13 15:25:38

+0

你们都是绝对正确的。 – LukeP 2010-01-13 15:51:41

0

如果你真的关心项目的组织,你应该看看Matchbox

从火柴盒文档:

火柴盒是一套扩展库,可以让您安排在小部件(模块)应用程序。这些模块有几个优点,主要是便携性。模块存储在他们自己的文件夹中,因此它们可以在其他应用程序中重用,或者通过复制该文件夹在用户之间共享。

这可以让你真正通过将相关模型和控制器在同一文件夹组织内容。