📚
note
Blog
  • Initial page
  • JS-notes
    • 使用浏览器书签执行js代码
    • JSON.stringify的小技巧
    • Fisher–Yates shuffle洗牌算法
    • 打印页面
  • Web-notes
    • 在网页中引入在线字体
  • Uniapp-notes
    • swiper-item高度自适应
    • 微信小程序的图片预览兼容性处理
  • VUE-notes
    • vue-note
    • vue3-note
  • VPS-notes
    • CentOs7笔记
    • ssh小记
    • Ubuntu笔记
    • vps安全相关
    • [Google Drive笔记](VPS-notes/Google Drive笔记.md)
  • TypeScript-notes
    • ts热编译项目
    • TypeScript笔记
    • js项目转ts
  • Python-notes
    • Python爬虫笔记
    • Python笔记
  • PHP-notes
    • php笔记
    • php+redis
    • php-codeIgniter
    • php抽奖算法
    • Laravel笔记
  • Mobile-notes
    • 移动端常用样式及兼容相关
  • Linux-notes
    • linux常用指令
  • Game-notes
    • Minecraft-server
  • TelegramBot-notes
    • tg-bot小记
  • Windows-notes
    • window-note
    • node-note
    • WSL-note
  • RaspberryPi-notes
    • RaspberryPi-note
    • 其他玩法
    • Openwrt
    • Ubuntu安装指南
  • Phone-notes
    • ZenFone6-note
  • Cocos-notes
    • Cocos-note
  • Network-notes
    • 单线复用
  • Other-notes
    • 国际化地域标识码
Powered by GitBook
On this page
  • 安装
  • 主题
  • 控制器
  • 视图
  • 模型
  • 辅助函数
  • CodeIgniter类库
  • 资源自动加载
  • 小技巧
  • 引用静态资源
  • 使用Redis
  • 引用composer安装的库
  • 部署CI框架的项目到服务器后遇到的问题
  • 通过axios使用post方式提交的错误
  • 修改开发/线上环境
  • 部署线上环境后提示system文件指向错误

Was this helpful?

  1. PHP-notes

php-codeIgniter

Last updated 2 years ago

Was this helpful?

安装

下载最新版本并解压至服务器文件夹。

主题

控制器

url分段

example.com/class/function/ID

  1. 第一段表示要调用的控制器类;(文件夹:application/controllers)

  2. 第二段表示要调用类中的指定函数或方法;

  3. 第三段及其后面所有代表传给控制器的参数。

隐藏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 配置文件中启用它。 打开你的配置文件,查找下面这几项:

$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';

将enable_query_strings设置为true,设置后,url格式变成:index.php?c=controller&m=method。其中controller是控制器的类名,method是要执行的方法名。

处理输出

控制器里创建一个_output()方法,它会将数据的最终状态发送到浏览器。

当数据传到 _output() 方法时,数据已经是最终状态。这时基准测试和计算内存占用都已经完成, 缓存文件也已经写到文件(如果你开启缓存的话),HTTP 头也已经发送。 为了使你的控制器能正确处理缓存,_output() 可以这样写:

if ($this->output->cache_expiration > 0)
{
    $this->output->_write_cache($output);
}

私有方法

将方法声明为 private 或 protected,在方法名前加上一个下划线前缀也可以让该方法无法访问。

private function _utility()
{
    // some code
}

构造函数

当有需要在控制器中使用构造函数时,需要用代码覆盖父类的构造函数,需要手工调用它

<?php
class Blog extends CI_Controller {
    public function __construct()
    {
        // 需要添加下面这一行
        parent::__construct();
        // Your own constructor code
    }
}

视图

创建与加载视图

在application/views/创建一个php文件,里面写html内容,在控制器里使用下面的方法来加载指定视图

$this->load->view('name');

name参数是视图的文件名。

向视图添加动态数据

在上面加载视图的方法的第二个参数,可以像视图动态传入数据,这个参数可以使数组或者对象。

// 数组
$data = array(
    'title' => 'My Title',
    'heading' => 'My Heading',
    'message' => 'My Message'
);
// 对象
$data = new Someclass();

$this->load->view('blogview', $data);

在视图文件写入数组相对于的变量

<html>
<head>
    <title><?php echo $title;?></title>
</head>
<body>
    <h1><?php echo $heading;?></h1>
</body>
</html>

循环

用于在视图页面循环一个多维数组

<?php
class Blog extends CI_Controller {

    public function index()
    {
        $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');

        $data['title'] = "My Real Title";
        $data['heading'] = "My Real Heading";

        $this->load->view('blogview', $data);
    }
}

在视图页面展开循环

<html>
<head>
    <title><?php echo $title;?></title>
</head>
<body>
    <h1><?php echo $heading;?></h1>
    <h3>My Todo List</h3>
    <ul>
    <?php foreach ($todo_list as $item):?>
        <li><?php echo $item;?></li>
    <?php endforeach;?>
    </ul>
</body>
</html>

模型

创建模型

在application/models/目录下创建模型php文件

class Model_name extends CI_Model {
    public function __construct()
    {
        parent::__construct();
        // Your own constructor code
    }
}

文件名和类名应该一致,如上方的模型,其文件名应该为Model_name.php;

加载模型

在控制器的方法中加载和调用

 $this->load->model('model_name');
// 如果是在子目录里,需要带上文件夹名称
$this->load->model('blog/queries');

// 加载之后,就可以通过类名的方式调用模型里面的方法
$this->load->model('model_name');
$this->model_name->method();

// 如果你想将你的模型对象赋值给一个不同名字的对象,你可以使用 $this->load->model() 方法的第二个参数:
$this->load->model('model_name', 'foobar');
$this->foobar->method();

如果你有一个模型需要在整个应用程序中使用,需要在CodeIgniter初始化的时候就自动加载它,需要在application/config/autoload.php文件将该模型添加到autoload['model']数组中。

辅助函数

加载辅助函数

在控制器使用下面的方法加载辅助函数

$this->load->helper('name');

// 假如要加载URL辅助函数
$this->load->helper('url');

// 加载多个辅助函数
$this->load->helper(array('helper1', 'helper2', 'helper3'));

如果有辅助函数需要在整个应用程序中使用,在application/config/autoload.php中的$autoload['helper']添加它们。

扩展辅助函数

在application/helpers/目录下新建一个文件,文件名以MY_开头,以_helper结尾。

开头的MY_可以通过配置项$config['subclass_prefix']进行修改。

例如,写一个数组判断的辅助函数,创建文件application/helpers/MY_array_helper.php

function any_in_array($needle, $haystack)
{
    $needle = is_array($needle) ? $needle : array($needle);
    foreach ($needle as $item)
    {
        if (in_array($item, $haystack))
        {
            return TRUE;
        }
        }
    return FALSE;
}

CodeIgniter类库

加载类库

使用控制器初始化:

// 调用表单验证类库
$this->load->library('form_validation');

// 多类库同时加载
$this->load->library(array('email', 'table'));

创建类库

除了数据库类不能被扩展和替换以外,其他的类都可以。

新建的类库文件需要存储在application/libraries目录下。

命名约定

  • 文件名首字母需要大写;

  • 类名首字母需要大写;

  • 类名和文件名必须一致。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
    public function some_method()
    {
    }
}

在控制器加载上面的那个自己创建的类

$this->load->library('Someclass')

加载后,即可使用小写字母命名的方式来访问你的类

$this->someclass->some_method();

如果需要在类库初始化传入参数,可以通过第二个参数动态传递一个数组。

$params = array('type' => 'large', 'color' => 'red');
$this->load->library('someclass', $params);

如果你使用了该功能,你必须在定义类的构造函数时加上参数:

<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
    public function __construct($params)
    {
        // Do something with $params
    }
}

在创建的类库中使用CodeIgniter资源

在一般情况下,在控制器里使用CodeIgniter原生资源会使用$this来调用,但是如果要在自己创建的类中使用Codeigniter资源,则需要通过get_instance()函数来访问。将这个函数赋值给一个变量后,就可以用这个变量代替$this。

$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');

你会看到上面的 get_instance() 函数通过引用来传递:

$CI =& get_instance();

这是非常重要的,引用赋值允许你使用原始的 CodeIgniter 对象,而不是创建一个副本。

使用新建的类库替换原生类库

简单的将你的类文件名改为和原生的类库文件一致,CodeIgniter 就会使用它替换掉原生的类库。 要使用该功能,你必须将你的类库文件和类定义改成和原生的类库完全一样,例如, 要替换掉原生的 Email 类的话,你要新建一个 application/libraries/Email.php 文件, 然后定义定义你的类:

class CI_Email {}

注意大多数原生类都以 CI_ 开头。

要加载你的类库,和标准的方法一样:

$this->load->library('email');

注意数据库类不能被你自己的类替换掉。

扩展原生类库

在扩展类的时候需要注意:

  • 类的定义时需要继承它的父类

  • 新的类名和文件名需要以MY_为前缀(可通过配置项$config['subclass_prefix']进行修改)

例如,要扩展原生的 Email 类你需要新建一个文件命名为 application/libraries/MY_Email.php , 然后定义你的类:

class MY_Email extends CI_Email {}

如果你需要在你的类中使用构造函数,确保你调用了父类的构造函数:

class MY_Email extends CI_Email {
    public function __construct($config = array())
    {
        parent::__construct($config);
    }
}

并不是所有的类库构造函数的参数都是一样的,在对类库扩展之前 先看看它是怎么实现的。

加载扩展的类

要加载你的扩展类,还是使用和通常一样的语法。不用包含前缀。例如, 要加载上例中你扩展的 Email 类,你可以使用:

$this->load->library('email');

资源自动加载

  • libraries/ 目录下的核心类

  • helpers/ 目录下的辅助函数

  • config/ 目录下的用户自定义配置文件

  • system/language/ 目录下的语言文件

  • models/ 目录下的模型类

修改配置文件application/config/autoload.php,将其数组添加你要自动加载的资源。

小技巧

引用静态资源

将需要引用的静态资源放在根目录,设置CI框架的base_url,设置自动加载url辅助函数。

然后就可以在视图文件里进行引入:

<link rel="stylesheet" href="<?=base_url()?>/assets/css/index.css">
<script src="<?=base_url()?>/assets/js/index.js"></script>

使用Redis

配置文件application/config/config.php中的$config['sess_driver']修改为redis。

在application/config/目录下创建一个名为redis.php配置文件,可用参数如下:

$config['socket_type'] = 'tcp'; //`tcp` or `unix`
$config['socket'] = '/var/run/redis.sock'; // in case of `unix` socket type
$config['host'] = '127.0.0.1';
$config['password'] = NULL;
$config['port'] = 6379;
$config['timeout'] = 0;

使用方法例子

$this->load->driver('cache');
$this->cache->redis->save('foo', 'bar', 10);

引用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

设置伪静态:

# CI接口在api文件夹内
if (!-f $request_filename){
  set $rule_0 1$rule_0;
}
if (!-d $request_filename){
  set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
  rewrite ^/api/(.*)$ /api/index.php/$1 last;
}

或者

# CI直接在根目录部署
if ($request_uri ~* ^/system)
{
 rewrite ^/(.*)$ /index.php?/$1 last;
 break;
}

if (!-e $request_filename)
{
 rewrite ^/(.*)$ /index.php?/$1 last;
 break;
}

通过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 传参

let param = new URLSearchParams()
param.append('username', 'admin')
param.append('pwd', 'admin')
axios({
	method: 'post',
	url: '/api/lockServer/search',
	data: param
})

解决方式2:使用transformRequest转换数据

import Qs from 'qs'
axios({
	url: '/api/lockServer/search',
	method: 'post',
	transformRequest: [function (data) {
	    // 对 data 进行任意转换处理
	    return Qs.stringify(data)
    }],
	data: {
	    username: 'admin',
		pwd: 'admin'
	}
})

解决方式3:通过字符串拼接的方式传参

axios.post('/api/lockServer/search',"userName='admin'&pwd='admin'");

修改开发/线上环境

根据当前环境是“开发环境”或是“线上环境”以处理程序异常时是否抛出错误信息。

修改.htaccess文件

# 添加这一行代表处于开发环境
SetEnv CI_ENV development

# 添加这一行代表处于线上环境,不显示错误信息
SetEnv CI_ENV production

具体错误信息处理,可在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文件的两个路径指向更改为:

$system_path = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'system';
$application_folder = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'application';

另外,如果你想让 CodeIgniter 使用 的自动加载, 只需将 application/config/config.php 配置文件中的 $config['composer_autoload'] 设置为 TRUE 或者设置为你自定义的路径。

使用对URL进行字符串处理,需要注意的是,IE浏览器不支持这个api。

前往官网
辅助函数参考
类库参考
Composer
URLSearchParams