CodeIgniter中constants.php全局常量数组的CRUD实现方法
解答
首先先纠正一个核心认知:PHP里用define()定义的常量一旦声明就无法在运行时修改,你现在把取消原因存在常量里,本身是没法直接做增删改操作的,必须配合存储层的修改逻辑才能实现CRUD。
一、增删改功能实现方案
首先先改你现有代码的两个明显bug:
- 循环输出option时,
value属性填的是$reasons整个数组,应该填当前条目的key或者具体值 - 最后闭合标签写错了,
<select>应该换成</select>,否则HTML渲染会错乱
实现CRUD有两种常见路径,优先选第一种:
- 推荐方案:换存储介质,不要用constants存可变内容
constants.php本身是用来存固定不变的系统常量的,存可修改的业务数据本身就不符合设计规范。- 最稳妥的方式是建一张简单的
cancel_reasons数据库表,只需要id(主键)、content(存取消原因文本)两个字段,增删改查就是普通的数据库操作,和你项目里其他业务的CRUD逻辑完全一致,没有文件读写权限、并发写坏文件的问题,维护成本最低。 - 如果不想用数据库,就把数组移到CodeIgniter的自定义配置文件里,比如新建
application/config/cancel_config.php,直接返回数组:
读取的时候用CI自带的配置类加载就行,修改时可以通过文件操作把新的数组写回配置文件,比改constants.php的逻辑简单很多。<?php return [ 'cancel_reasons' => [ 'Service(s) are no longer needed', 'Choosing another company to work with', 'Disatisfied with service(s) provided', 'Service(s) are too expensive' ] ];
- 最稳妥的方式是建一张简单的
- 不推荐方案:硬写文件修改constants.php
如果你非要保留现有常量存储的形式,只能自己写文件读写逻辑:先读取constants.php的源码,用正则匹配到cancel_reasons对应的数组片段,替换成增删改后的新数组,重新拼接成合法的PHP代码再写回文件。这种方式要求给constants.php开web服务写权限,并发请求的时候很容易把文件写白导致整个项目报错,生产环境绝对不要用。
不管选哪种存储方式,前端交互逻辑都是通用的:
- 列表页读取所有取消原因,每条条目后面挂编辑、删除按钮,页面顶部放新增原因的输入框和提交按钮
- 新增:前端提交新的原因文本,后端把内容追加到存储结构里保存,刷新列表即可
- 编辑:点击编辑按钮回填当前内容,提交后后端找到对应条目替换文本后保存
- 删除:点击删除按钮传递对应条目的唯一标识,后端从存储结构里移除对应项后保存
二、传值到视图层会不会简化实现?
会,而且会简化很多。
你现在在控制器里直接拼echo HTML的写法,把业务逻辑和视图渲染完全混在一起,后续要加个按钮、改个样式、加个提交表单都要在控制器里拼字符串,不仅写起来麻烦,出了问题排查也很费劲。
把数组传到视图之后,你可以直接写原生HTML,循环输出、加表单、加JS交互都不用拼转义字符串,代码可读性高很多。
控制器只需要负责读数据、处理提交请求,视图负责渲染页面,符合CI的MVC设计规范。
举个最简单的调整示例:
控制器代码改成:
public function crudCancelConstants() { // 第二个参数传true,转成关联数组比stdClass对象操作更方便 $data['reasons'] = json_decode(cancel_reasons, true); $this->load->view('cancel_reasons/crud_page', $data); }
对应视图文件里直接写HTML即可:
<h5>View all cancellation reasons below:</h5> <select> <option value="Select" selected>View Reasons</option> <?php foreach ($reasons as $key => $value): ?> <option value="<?php echo $key; ?>"><?php echo $value; ?></option> <?php endforeach; ?> </select> <!-- 后续加新增表单、编辑删除按钮、AJAX逻辑可以直接在这写,不用拼字符串 -->
内容的提问来源于stack exchange,提问作者imanolgh
相关产品推荐
相关产品推荐

