CodeIgniter引用有命名空间的类库

最近有需求生成唯一的邀请码给用户,前些天用Node.js给公司开发项目时,同事用过一个Hashids类库来生成唯一的验证码(可参考:http://hashids.org/)。这次使用的框架是PHP的Codeigniter (CI)框架。目前最新CI框架3.0.x还不支持命名空间。而这个Hashids的PHP版本用到了命名空间。

首先,想将这个Hashids作为一个类库,使用$this->load->library(‘Hashids’);加载,试验了下,需要直接require指定的类文件才可以使用。感觉应该有更好地解决办法。google搜索了下,看到用的是spl_autoload_register来实现的自动加载类库。

具体代码如下:

<?php defined('BASEPATH') OR exit('No direct script access allowed'); 
    /**
     * Hashids integration * Hashids 集成 * @author * http://hashids.org/php/
     */
     spl_autoload_register(function($class) { 
        $file = __DIR__ . '/../libraries/' . strtr($class, '\\', '/').'.php';

        if(file_exists($file)) { 
            require $file; return true; 
        } 
    });

    Class Hashids{ 
        private $Hashid;
        public function __construct($params = []) {
            $salt = isset($params[0]) ? $params[0] : '';
            $min_hash_length = isset($params[1]) ? $params[1] : 0;
            $alphabet = isset($params[2]) ? $params[2] : '';
            $this->Hashid = new Hashids\Hashids($salt, $min_hash_length, $alphabet);
        }
  
        public function __call($method, $arguments)
        {
            return call_user_func_array(array($this->Hashid, $method), $arguments);
        }
    }

 

然后直接在Controller中调用:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
    class Test extends CI_Controller{
        public function __construct() {
            parent::__construct();
        }
        public function index() {
            $this->load->library('hashids', ['Test',  6, 'ABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789']);
            $hashids = $this->hashids->encode(999999);
            var_dump($hashids); // K0ZVW9
        }
    }

 

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>