Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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
Codeigniter 结构编码点火器的应用_Codeigniter_Refactoring - Fatal编程技术网

Codeigniter 结构编码点火器的应用

Codeigniter 结构编码点火器的应用,codeigniter,refactoring,Codeigniter,Refactoring,编辑: 使用CodeIgniter构造复杂应用程序的最佳方法是什么?为了使这个问题更具体,也许只关注构造控制器:如果您有一个用户控制器,那么所有函数都应该在这个文件中吗?换句话说,您可能有绑定到特定视图的控制器操作,但也有一组辅助函数 原始问题:考虑到一个复杂的应用程序,包括用户、事务和产品,为每个应用程序都配备一个控制器有意义吗?既然每一个都对应于一个数据库表,那么是否为每一个表都有一个相应的模型呢?我想是的,但我目前正在开发的应用程序包括一个3000线控制器和一个3000线模型。只是想验证有

编辑:

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


原始问题:考虑到一个复杂的应用程序,包括用户、事务和产品,为每个应用程序都配备一个控制器有意义吗?既然每一个都对应于一个数据库表,那么是否为每一个表都有一个相应的模型呢?我想是的,但我目前正在开发的应用程序包括一个3000线控制器和一个3000线模型。只是想验证有关CI和应用程序结构的标准实践。

应该将控制器分开。但如果您不使用路由器来更改url,控制器也会更改url


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

首先,模型肯定需要分离为以下内容:

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

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

transaction:
 ...
 ...
你应该明白这一点

控制器也可以做一些分离。在这个场景中,我的控制器是

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

users: 
 add_user();
 delete_user();
 ...
等等。 在控制器和模型中重复相同功能的原因是,您可以轻松地更改模型以访问不同的数据库/数据源,除此之外,无需更改任何内容


此外,例如,在添加用户时,完全不需要加载产品模型。

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

我从模特开始。我为mysql数据库中的一个表编写了1个模型。我已经在
系统/应用程序/库/
文件夹中设置了
我的\u模型
类。这个类有
get\u detail
get\u list
get\u total
get\u all
insert
update
delete
方法。我将表名存储在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
视图可以放置在子文件夹中,例如,我可以按如下方式排列:

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

如果您真的关心项目组织,您应该去看看

从火柴盒文档:

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


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

在我看来,类产品的方法不需要“\u-product”,因为$product->add()就足够了,$product->add\u-product()重复了。我很久以前在一个项目上就开始了“\u-product”约定,我愿意付出一切去回报。结果是额外的输入太多了。这是否假设您的所有主键都是“id”?最近我通过添加新属性更新了我的_模型:$primary_key。此属性将保存表的主键列名,默认值为“id”。通过这种方式,我可以灵活地处理使用“id”以外的列作为主键的表,例如:“country_id”。这是一个好主意,但我通常避免混合使用管理代码和前端代码。虽然大多数数据交互都是相同或相似的,但您必须记住,控制器中的代码越多,它们的速度就越慢。PHP不需要为每个前端用户解析所有不相关的管理代码来查看您的站点。是的,Phil,这就是为什么我总是尽量保持控制器的小型化。在我最新的项目中,我的客户需要一个真正定制的url,所以所有的首页都由一个特殊的控制器处理。你写的代码越多,它就越精细。我甚至对我6个月前写的代码感到羞愧:)