php-codeIgniter
安装
前往官网下载最新版本并解压至服务器文件夹。
主题
控制器
url分段
example.com/class/function/ID
第一段表示要调用的控制器类;(文件夹:
application/controllers)第二段表示要调用类中的指定函数或方法;
第三段及其后面所有代表传给控制器的参数。
隐藏url中的index.php
默认情况下,url会包含index.php,如果你的服务器是使用Apache,且启用了mod_rewrite,则可以在项目的根目录添加一个.htaccess文件,里面内容:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt) # 这里写要排除的资源
RewriteRule ^(.*)$ index.php/$1 [L]启用查询字符串
在 application/config.php 配置文件中启用它。 打开你的配置文件,查找下面这几项:
将enable_query_strings设置为true,设置后,url格式变成:index.php?c=controller&m=method。其中controller是控制器的类名,method是要执行的方法名。
处理输出
控制器里创建一个_output()方法,它会将数据的最终状态发送到浏览器。
当数据传到 _output() 方法时,数据已经是最终状态。这时基准测试和计算内存占用都已经完成, 缓存文件也已经写到文件(如果你开启缓存的话),HTTP 头也已经发送。 为了使你的控制器能正确处理缓存,_output() 可以这样写:
私有方法
将方法声明为 private 或 protected,在方法名前加上一个下划线前缀也可以让该方法无法访问。
构造函数
当有需要在控制器中使用构造函数时,需要用代码覆盖父类的构造函数,需要手工调用它
视图
创建与加载视图
在application/views/创建一个php文件,里面写html内容,在控制器里使用下面的方法来加载指定视图
name参数是视图的文件名。
向视图添加动态数据
在上面加载视图的方法的第二个参数,可以像视图动态传入数据,这个参数可以使数组或者对象。
在视图文件写入数组相对于的变量
循环
用于在视图页面循环一个多维数组
在视图页面展开循环
模型
创建模型
在application/models/目录下创建模型php文件
文件名和类名应该一致,如上方的模型,其文件名应该为Model_name.php;
加载模型
在控制器的方法中加载和调用
如果你有一个模型需要在整个应用程序中使用,需要在CodeIgniter初始化的时候就自动加载它,需要在application/config/autoload.php文件将该模型添加到autoload['model']数组中。
辅助函数
加载辅助函数
在控制器使用下面的方法加载辅助函数
如果有辅助函数需要在整个应用程序中使用,在application/config/autoload.php中的$autoload['helper']添加它们。
扩展辅助函数
在application/helpers/目录下新建一个文件,文件名以MY_开头,以_helper结尾。
开头的MY_可以通过配置项
$config['subclass_prefix']进行修改。
例如,写一个数组判断的辅助函数,创建文件application/helpers/MY_array_helper.php
CodeIgniter类库
加载类库
使用控制器初始化:
创建类库
除了数据库类不能被扩展和替换以外,其他的类都可以。
新建的类库文件需要存储在application/libraries目录下。
命名约定
文件名首字母需要大写;
类名首字母需要大写;
类名和文件名必须一致。
在控制器加载上面的那个自己创建的类
加载后,即可使用小写字母命名的方式来访问你的类
如果需要在类库初始化传入参数,可以通过第二个参数动态传递一个数组。
如果你使用了该功能,你必须在定义类的构造函数时加上参数:
在创建的类库中使用CodeIgniter资源
在一般情况下,在控制器里使用CodeIgniter原生资源会使用$this来调用,但是如果要在自己创建的类中使用Codeigniter资源,则需要通过get_instance()函数来访问。将这个函数赋值给一个变量后,就可以用这个变量代替$this。
你会看到上面的
get_instance()函数通过引用来传递:这是非常重要的,引用赋值允许你使用原始的 CodeIgniter 对象,而不是创建一个副本。
使用新建的类库替换原生类库
简单的将你的类文件名改为和原生的类库文件一致,CodeIgniter 就会使用它替换掉原生的类库。 要使用该功能,你必须将你的类库文件和类定义改成和原生的类库完全一样,例如, 要替换掉原生的 Email 类的话,你要新建一个 application/libraries/Email.php 文件, 然后定义定义你的类:
注意大多数原生类都以 CI_ 开头。
要加载你的类库,和标准的方法一样:
注意数据库类不能被你自己的类替换掉。
扩展原生类库
在扩展类的时候需要注意:
类的定义时需要继承它的父类
新的类名和文件名需要以MY_为前缀(可通过配置项
$config['subclass_prefix']进行修改)
例如,要扩展原生的 Email 类你需要新建一个文件命名为 application/libraries/MY_Email.php , 然后定义你的类:
如果你需要在你的类中使用构造函数,确保你调用了父类的构造函数:
并不是所有的类库构造函数的参数都是一样的,在对类库扩展之前 先看看它是怎么实现的。
加载扩展的类
要加载你的扩展类,还是使用和通常一样的语法。不用包含前缀。例如, 要加载上例中你扩展的 Email 类,你可以使用:
资源自动加载
libraries/ 目录下的核心类
helpers/ 目录下的辅助函数
config/ 目录下的用户自定义配置文件
system/language/ 目录下的语言文件
models/ 目录下的模型类
修改配置文件application/config/autoload.php,将其数组添加你要自动加载的资源。
另外,如果你想让 CodeIgniter 使用 Composer 的自动加载, 只需将 application/config/config.php 配置文件中的 $config['composer_autoload'] 设置为 TRUE 或者设置为你自定义的路径。
小技巧
引用静态资源
将需要引用的静态资源放在根目录,设置CI框架的base_url,设置自动加载url辅助函数。
然后就可以在视图文件里进行引入:
使用Redis
配置文件application/config/config.php中的$config['sess_driver']修改为redis。
在application/config/目录下创建一个名为redis.php配置文件,可用参数如下:
使用方法例子
引用composer安装的库
在项目跟目录下载号需要安装的包后,需要修改application/config/config.php里面的$config['composer_autoload'],指向vendor文件夹的autoload.php文件。
然后在你需要用到这个库的控制器使用就可以了。
部署CI框架的项目到服务器后遇到的问题
提示session路径错误
前往config.php文件内将$config['sess_save_path'] = NULL;修改为$config['sess_save_path'] = sys_get_temp_dir();
访问CI接口404
设置伪静态:
或者
通过axios使用post方式提交的错误
当前端项目是使用axios时,通过post提交数据到CI框架的后台时,后台通过$_POST将接收不到这些数据,原因是:
当我们使用axios时,axios将会帮我们将请求数据和响应数据将会自动转换为JSON数据。这时,我们的请求中的Content-Type会变成application/json;charset=utf-8。因为我们的参数是 JSON 对象,axios 帮我们做了一个 stringify 的处理。
然而,我们服务端的要求是Content-Type': 'application/x-www-form-urlencoded,所以是接收不到前端发送的数据的。
解决方式1:使用URLSearchParams 传参
使用URLSearchParams对URL进行字符串处理,需要注意的是,IE浏览器不支持这个api。
解决方式2:使用transformRequest转换数据
解决方式3:通过字符串拼接的方式传参
修改开发/线上环境
根据当前环境是“开发环境”或是“线上环境”以处理程序异常时是否抛出错误信息。
修改.htaccess文件
具体错误信息处理,可在index.php文件头部进行处理
部署线上环境后提示system文件指向错误
在IIS服务器上遇到过这个问题,部署完成后提示:Your system folder path does not appear to be set correctly. Please open the following file and correct this: index.php
可将CI根目录的index.php文件的两个路径指向更改为:
Last updated
Was this helpful?