CI框架(CodeIgniter)使用技巧和步骤小结(三)

作者:掠影
最后编辑时间:2017-05-03 22:27:31
浏览次数:1829



    上一节中我们谈到了CI中路由机制的使用和实现机理,简单介绍了路径匹配,通配符,正则表达式,回调函数在CI路由中的应用,本节,将对CI中核心部件——控制器(Controller)进行简要分析。由于控制器所涉及的部分较多,故而可能分为两节进行总结。

    首先我们介绍一下控制器的用途:正如上篇博客CI框架(CodeIgniter)使用技巧和步骤小结(一)中所谈到的,控制器主要用途就是将Model,View的成分黏合起来,起到一个“黏合剂”的作用。在控制器中,我们可以加载Model成员,进行业务逻辑的处理和数据库的读写,并通过加载View成员/直接输出数据的形式,将经过处理的请求返回给客户端中。与此同时,控制器也可以作为过滤器使用,在接收到不符合要求的请求时,可在控制器指定函数内进行请求过滤,从而减少了对Model以及数据库的请求,从而提高系统性能。如:


public function reviewAction()
{
    $data = $this->input->post("id");
    if( !isset($data["id"] )
    {
         $this->returnJson(array("code=>"error"));//过滤不符合格式的请求
    }
    else
    {
         $this->returnJson($this->Review_model->dealReview($data);
    }
}


    在上篇博文中,我们谈到了CI中控制器主要有两种主要函数类型,一种为渲染页面类型的,即将请求处理后渲染到指定view文件中,并将渲染后view文件返回给服务器;另一种为直接输出数据的,即不渲染view,将数据直接以json/xml等形式返回给请求方的。实际上,这两种分类仅仅是业务中所常用的,接下来,我们将通过解析system/core/Controller.php的代码来详细介绍控制器中各函数的作用。


    1. 构造函数__construct():   

    接触过OOP的朋友应该都知道构造函数在class中用途,即在对象实例化的过程中,首先调用的一个方法。在CI中,由于所有的控制器类都是CI_Controller类的子类,故而均需继承其构造函数,以下为__construct()的代码:

    

public function __construct()
{
	self::$instance =& $this;
        //通过self的$instance来实现单例化,利用单例的特性,减少不同请求中new对象的开销,降低内存占用         foreach (is_loaded() as $var => $class)
	{
		$this->$var =& load_class($class);
	}
        // 加载控制器中组件,并传递给核心控制器
	$this->load =& load_class('Loader', 'core');        
        // 给核心控制器加载Loader成员,以便调用$this->load方法 $this->load->initialize();        // 初始化Load成员 log_message('info', 'Controller Class Initialized'); }


    __construct()中,主要实现了对象的单例化和加载器成员的实例化,从而为后续成员函数的调用奠定了基础。与此同时,我们在声明自定义的控制器类时,也可以通过重写的方式,在继承父类(CI_Controller)的构造函数的前提上,实现我们自己的构造函数逻辑,比如加载特定model对象,加载指定library等。


    2.辅助函数:

   在控制器中,可以存在一些辅助函数,以帮助实现请求数据过滤等操作,而这些函数一般都是protected或private的,也就是说,无法通过URL来访问到,仅可被类内部函数调用。例如:


protected function checkEmpty($inputs)
{
    foreach($inputs as $input)
    {
        if( empty($input) || !isset($input) )
        {
        return true;
        }
    }
    return false;
}


即通过对输入数组进行逐项遍历的方式,确保输入数据均不为空。

   3.内容函数:

   即我们上文所述的两种输出函数,通过渲染/直接返回的方式返回内容;在此不做赘述。

   4.数据渲染:

    在内容函数中,第一种为渲染页面的形式,即$this->load->view("XXX",array());的形式,其中,XXX为指定的view文件名(无需后缀),而函数的第二项成员array即为一个对象数组。举例而言,$data = array("id"=>1,"name"=>"test"), 若将$data作为第二项成员,传入函数中,则在XXX文件中,我们就可以直接通过$id,$name来使用传入的数据,此时echo $name;的结果就是"test"了。

    

    以上为控制器的小结的主要内容,后续有所得,将继续更新。下一节主要为对Model的小结,敬请期待。

取消

感谢您的支持,我会继续努力的!关闭

扫码支持
大家有钱的捧个钱场,没钱的捧个人场233333

打开支付宝扫一扫,即可进行扫码打赏哦

分享到: QQ空间 更多



评论区

  • 101.226*****: 2017-05-03
    感觉CI的控制器内容不多啊。。。