• 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(这篇比较复杂)

     





    附件列表

  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/star91/p/4893287.html
Copyright © 2020-2023  润新知