资讯专栏INFORMATION COLUMN

CI 框架简单入门笔记

Kross / 1285人阅读

摘要:方法名不区分大小写。当时有面试官还问过,我以为所有的框架都是,真是汗颜的属性有等的超级对象类分段获取从入口文件后,分断获取是按照后面开始的第一个段开始。

1.mvc一般思路

C层: 入口文件-URL获取控制器$_GET["c"]和方法$_GET["a"]--包含c的文件类(控制器文件)- 实例化c控制器对象-调用方法a(并协调模型和视图),C层不直接调用DB,下面会有提到。

V层: 在C层中include views下对应的文件即可展现C中变量,require ./views/xxView.html

M层:通过连接DB获取所有的数据,return 给C层,这时候需要在C层require ./models/xxModel.php,最后在C中通过view 让数据显示出来。注意M只提供数据,做数据复用

注意action 是控制器中的方法,用于被浏览器直接请求

目录结构

index.php

Model

UserModel.class.php

View

index.html

Controller

UserController.class.php
2.CI中的pathinfo访问模式

入口文件/控制器/方法

其中action中为protected functon 和private 不能被浏览器请求,注意Controller文件名需要小写。方法中action (public functions)不能用_开始。

方法名不区分大小写。

CI中都extends CI_CONTROLLER,注意前缀都为CI

注意不要建立Index控制器的index方法,类名相同的会当作构造方法。因为CI的控制器没有后缀,所以类名会和方法名一样,导致构造函数加载。

3.CI中的视图

视图文件可以用下划线区分,例如user_区分,但一般都建立多带带的文件夹,可以直接load视图,不用写扩展名。

$this->load->view("user/index");
$this->load->view("user_index");

注意视图中可以直接写php源码。

CI中如果没用smarty ,如果需要加载变量可以用

$this->load->var("title","this is title");

如果是二维数组,

$data[]=1;
$data[]=2;
$this->load->var($data);

可以多次load view,以加载不同的view公共部分。

推荐使用





4.CI的超级对象-LOAD

$this->load ===

$obj=new CI_LOADER();
$this->load=$obj;
$this->load->view();

注意但ci并不是做的自动加载,并不是以上面那种方式运行的。当时有面试官还问过,我以为所有的框架都是spl_autoload_register,真是汗颜..

load的属性有view var database model helper

5.CI的超级对象-CI_URI类

分段获取
segment 从入口文件.php后,分断获取
$this->uri->segment(4)是按照index.php/后面开始的第一个段开始。

之前的:入口文件.php/控制器/动作/参数1/值1/参数2/值2
CI中: 入口文件.php/控制器/动作/值1/值2

$this->segment(3);//值1
$this->segment(4);//值2

可以在方法的参数中传递参数,ci会按照顺序获取值

index.php/控制器/index/6/12

public function index($p=0,$age){
    echo $p,$age;//6,12
}
6.CI的超级对象 input对象

CI_INPUT类

$this->input->post("username");

注意get的参数 用uri分段获取..

$this->input->server("DOCUMENT_ROOT")

视图里也可以通过$this访问超级对象,因为就是include进来的

7.CI中的数据库操作

数据库访问SQL

先配置config/database.php

装载数据库操作类,可以加载多个数据库

$this->load->databases();
//var_dump($this->db);
$res=$this->db->query("select * from user");// return object
$user_list=$res->result();
//注意返回的返回数组下的某(多)个对象,对应mysql_fetch_object

$data["user_list"]=$user_list
$this->load->view("user/list/",$data)//view 层用 user_list展现

$res->result_array();返回关联数组
$res->row();返回第一条数据,也是个对象
$res->row_array();返回第一条数据,数组

更多官方参考

插入数据

$this->load->database();//可以在auto中自动加载db类

$sql="insert into user ("name","pwd") values("tom","md5(123)")";

$this->db->query();//MYSQL_QUERY() [return RES or BOOL]

MYSQL_AFFECT_ROWS 对应CI中的$this->db->affect_rows();
MYSQL_INSERT_ID 对应CI 中的 $this->db->insert_id();

用此db处理方法,第一需要自己写表前缀,第二需要自己处理安全措施。

表前缀可以借助配置文件读取 常量,CI中有**SWAP_PRE**,交换的前缀来处理表前缀。万一数据库表前缀修改,只需要修改DBPREFIX就行了。

安全措施可以借助 $this->input->post("name");

$data[0]="tom";
$data[1]="123";

参数绑定插入

$sql="insert into user ("name","pwd") values("?","?")";

将data拼装为数组,作为$this->db->query($sql,$data);

参数绑定查询

$sql="select * from user where username=?";
$this->query($sql,$username);
8.CI中的AR模型

是CI中访问数据库的第二种方式,第一种就是上面的load->database();增删改差 都是query。需要写大量sql语句

配置文件autoload 自动加载database

$auto_load["librarys"]=array("database");

CI_DB_ATCIVE_record extends ci_db_driver

config/database中的active_record需要打开,这样才会继承ACTIVE

$res=$this->db->get("user");//user 表名,会自动加表前缀

var_dump($res->result);

插入:

$data=["name"=>"tom","pwd"=>"md5(123)"];
$this->db->insert("user",$data);//表名+关联数组=》return bool

修改:

$data=["email"=>tom@126.com,"pwd"=>"md5(1234)"];
$this->db->update("user",$data,array("id"=>3));// 表名,数据,where 条件。=?return bool

删除

$this->db->delete("user",array(id=>3));

AR中连贯操作

$this->db
    ->select("id,name")//字段名
        ->where ("id  ">=3)//需要有空格
        ->limit(3,2)//跳过2条,取三条
        ->order_by("id desc");
        ->get();

调试sql语句输出最后一条sql ,可以结合log函数输出到指定日志文件

$this->db->last_query();

$res=$this->db->where("name","tom")->get("USER");//SELECT * FROM USER WHERE NAME=TOM;

具体可点击这里查看更多连贯操作

如果太复杂的,那就写SQL吧,记得用?绑定参数,过滤接受参数等

自增id

$this->db->insert_id();

受影响行

$this->db->affect_rows();
9.对CI控制器扩展

APPLICATION和SYSTEM文件夹中相同的部分 ,只需要在application中对应的Core中写MY_扩展。
比如在application/core/MY_Controller.php

class MY_Controller extends CI_Controller{
    
        public function __construct(){
            parent::construct();
            //登录验证

        }
}

可以修改类前缀 在
config/config.php/$config["subclass_prefix"]中,默认为MY_

10.CI中的模型Model

一些注意事项:文件需要全小写,但是类名要大写,并且需要用User_model,为了和控制器保持区分不冲突。

在模型MODEL中可以用所有超级对象的属性,可以具体查看system/core/CI_MODEL.php 文件

不要在控制器直接调用$this->db->get()文章头提到【虽然可以实现相同功能,但是很不规范】应该放在model中,控制器中只允许从user_model中load

user controoler中代码:在控制器中加载模型

$this->load->model("user_model");//第二个参数为别名,可选

 $list=$this->user_model->getall();
 $this->load->view("user/index",array("list"=>$list));

user_model代码:

 class user_model extends ci_model{
    public function getall(){
        $res=$this->db->get("user");
                return $res->result();
    }
}
11.url相关函数

需要手动加载:

$this->load->helper("url");

解决不同环境,不同路径的问题
site_url
base_url
类似与wordpress那些东西

可以自动加载

 $autoload["helper"]=array("url")
12.路由配置

默认控制器 default_controller

通过路由规则,实现url与实际控制器相分离.实现url的高度定制

http://site.com/index.php/news/20170108/4.html
$route["news/[d]{6}/([d]+.html)"]="article/show/$1"

另外结合apache/nginx的rewrite 隐藏index.php

13.分页
$this->laod->library("pagination");

注意load url,然后用site_url,放入page的初始化函数中,用segment获取对应的intval(段),作为offset

CI中更多细节请点这里

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22278.html

相关文章

  • Codeigniter 4.0-dev 版源码学习笔记之二——入口以及初始化操作

    摘要:通过这个函数可以很方便的在程序运行期间执行很多常见操作。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 index.php index.php 是整个框架的入口文件,也就是说所有的请求都要从它这里开始。因为 index.php 源码非常简洁,那么我们直接放一张源码截图,按着截图说一下源码。 showImg(https://segmentfault.com/img/re...

    _ivan 评论0 收藏0
  • Codeigniter 4.0-dev 版源码学习笔记之一——前言以及 CI 4 预览

    摘要:版权声明可转载,但不论任何媒体都需要在转载前与本人沟通,并在转载时注明出处。的各个核心模块以模块名为目录名分别存储在这个目录下。下一篇文章会涉及到和。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 写在前面: 为什么选择开发过程中的 CI 4 作为源码解读版本:(1)首先我选 CI 是因为它之前的稳定版都是相对比较轻量小巧的,而且可以认为是简单的。(2)为什么没有选...

    MSchumi 评论0 收藏0
  • Codeigniter 4.0-dev 版源码学习笔记之四——详细路由过程

    摘要:行,判断如果为空,那么返回默认路由。行,把处理完毕后找到的返回。方法该方法是自动按着约定规则去目录去找路由的过程。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 我个人觉得在当前 MVC 流行的架构下,要想去了解一个框架,或者是一个基于此架构下的应用程序,最好的入手方式就是先看路由,虽然路由不是 MVC 里的任何一个,但是知道了路由的来龙去脉就知道了整个框架或者...

    NSFish 评论0 收藏0
  • Codeigniter 4.0-dev 版源码学习笔记之五——相对于 3.x 的变化

    摘要:支持命名空间是没有支持命名空间的。配置文件不再是简单数组了新的配置文件是以对象组织的,各个配置以对象的属性形式暴露出来。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 CI 为了追上大家的脚步,这次跨了一大步,尽量使用了更多的流行设计理念,甚至连 PHP 的支持版本都是从 7 开始起步的。我在之前阅读源码的同时也发现了很多变化的地方,在此把已经发现的列举出来,不...

    Youngdze 评论0 收藏0
  • CI Weekly #4 | 不同规模的团队,如何做好持续集成?

    摘要:王者荣耀项目组高级测试工程师工程师文化团队中的实践本文不是一篇入门教程,而是从结合实际场景,阐述在团队协作中如何去好好地应用。 CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成、持续交付,持续部署、自动化测试、 DevOps 等实践教程、工具与资源,以及一些工程师文化相关的程序员 Tips 。同步于 flow.ci Blog、微信公众号、官方微...

    jeffrey_up 评论0 收藏0

发表评论

0条评论

Kross

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<