• CodeIgniter中驱动器的使用方法


    动器“Drivers”CodeIgniter框架从2.0版本开始加入的新特性。正如中文版译者所言:

    笔者看了这三篇英文参考,加上自己的一些理解,对官方文档关于驱动器的这一部分进行了一些补充。

    1.什么是驱动器

    驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类可以访问父类, 但不能访问兄弟类。在你的控制器中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成很多离散的类。

    一般我们看到父类和子类,我们会毫不犹豫的认为他们是继承和派生的关系,但是这里需要注意的是,驱动器中所提到的子类,并不是真的继承了父类驱动器,仅仅是其有访问父类驱动器的权限,在其中一篇参考文献中,作者将父类称为主类(master class),将此类称为次类(sub class),个人认为这种叫法比官方的更为精确,所以后面借用这一称谓。关于这个注意事项在后面的例子里读者可以看到。

    驱动器位于 system/libraries/ 目录,每个驱动器都有一个独立的目录,目录名和 驱动器父类的类名一致,在该目录下还有一个子目录,命名为 drivers,用于存放所有子类的文件。

    2.如何使用驱动器?

    要使用一个驱动器,你可以在控制器中使用下面的方法来进行初始化:

    $this->load->driver('class_name');

    class_name 是你想要调用的驱动器类名,例如,你要加载名为 Some_parent 的驱动器, 可以这样:

    $this->load->driver('some_parent');

    然后就可以像下面这样调用该类的方法:

    $this->some_parent->some_method();

    而对于那些子类,我们不用初始化,可以直接通过父类调用了:

    $this->some_parent->child_one->some_method();

    $this->some_parent->child_two->another_method();

     

    举一个实际的例子,假如我们需要创建一个Connect类来连接各种社交服务,并且从这些平台获取一些数据。直接借用外国网友的例子。

     

    实际的代码看起来是这样的:

    $this->load->driver('connect');
    $this->connect->facebook->get_friends();
    $this->connect->twitter->get_twitts();

    这样就把一些分散的功能集中到一个类库中了,而且结构非常清晰。

    3.如何创建驱动器


    CI
    的官方文档中并没有详细介绍如何自己写一个驱动器,因此这里是重点。创建驱动器的第一步是创建一个驱动器文件目录结构, 这里我们创建自己的驱动器,要放在application/libraries目录下。文件夹名和驱动器类名相同,并且首字母大写如Connect,在此文件夹中再创建一个子文件夹,一定要取名为drivers,注意这里文件夹名称是小写字母,在drivers文件内创建次驱动器文件,文件名以主驱动器类名加下划线开头。
    驱动器目录和文件结构布局如下图所示:
    Usage of drivers in CodeIgniter

    创建主驱动器类

    application/libraries/Connect/Connect.php

    <?php
     
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    classConnectextendsCI_Driver_Library
    {
        public$valid_drivers;
        public$CI;
     
        function__construct()
        {
            $this->CI = &get_instance();
            $this->CI->config->load('connect', TRUE);
            $this->valid_drivers = $this->CI->config->item('modules', 'connect');
     
        }
        publicfunctionget_friends()
        {
            return$this->twitter->get_friends() . $this->facebook->get_friends();
        }
     
    }

    读者应该注意到了主驱动器类继承的是CI_Driver_Library,变量$valid_drivers是必须的,它是用来告诉框架应该加载哪些次驱动器,它是一个包含次驱动器类名称的数组。有两种方法来定义这个变量:

    第一种方法是直接在驱动器代码中定义:

    将下面的代码替换构造函数的最后一句

    $this->Valid_drivers= array('connect_twitter', 'connect_facebook');
    第二种方法是通过配置文件:

    推荐采用这种方法,维护起来比较方便。创建一个文件application/config/connect.php

    <?php
    $config['modules'] = array('connect_twitter', 'connect_facebook');

    这个字段取名为modules,你可以自己取一个名称,然后正如上面那个例子那样来调用。
    在例子中我们还用$CI变量引用了框架的超级对象,然后加载配置文件,参数TRUE是为了防止名称与框架冲突,主驱动器类中的publicprotected变量和方法在次驱动器中都是可以访问的。

    创建次驱动器类
    application/libraries/Connect/drivers/Connect_twitter.php

    <?php
     
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    classConnect_twitterextendsCI_Driver
    {
        publicfunctionget_twitts()
        {
            return'Мои последние твитты:';
        }
     
        publicfunctionget_friends()
        {
            return'@vanya, @stepa ';
        }
    }
     



    application/libraries/Connect/drivers/Connect_facebook.php

    <?php
     
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    classConnect_facebookextendsCI_Driver
    {
        publicfunctionget_friends()
        {
            return'Ivan,  Stepan ';
        }
    }
     

    这里我们注意到次驱动器并不是继承主驱动器,也没有继承CI_Driver_Library而是CI_Driver

    4.在控制器中使用驱动器

    由于所有次驱动器有方法主驱动器的权限,次驱动器仅能通过主驱动器访问,因此次驱动器之间的数据交换要通过主驱动器作为中间桥梁。
    . application/controller/home.php

    <?phpif ( ! defined('BASEPATH')) exit('No direct script access allowed');
     
    classHomeextendsCI_Controller {
        publicfunction__construct()
        {
            parent::__construct();
            $this->load->driver('connect');
        }
     
        publicfunctionfriends()
        {
            echo'我社交网络的朋友: ';
            echo$this->connect->get_friends();
            //同时从两个站点获得
        }
     
        publicfunctiontwitts()
        {
            echo$this->connect->twitter->get_twitts();
            // Twitter记录
        }
    }

    这个例子相当简单, 但是对于理解CI中驱动器的概念很有参考价值,更复杂的应用可以参考最后一篇文章。

     

     

    参考文档:

    ·         Usage of drivers in CodeIgniter

    ·         Codeigniter Drivers Tutorial(这篇比较复杂)

     





    附件列表

  • 相关阅读:
    Python神库分享之geoip2 IP定位库
    科普一下推荐引擎
    浏览器插件之王-Tampermonkey(油猴脚本)
    Swagger入门教程
    使用SonarQube+Eclipse来分析python代码
    什么是搜索引擎蜘蛛?
    让所有网站都提供API的Python库:Toapi
    如何提高自己的逻辑思维能力?
    推荐系统和搜索引擎的关系
    html 后台页面布局
  • 原文地址:https://www.cnblogs.com/star91/p/4893287.html
Copyright © 2020-2023  润新知