thefredfox/cakephp-ip-type

CakePHP 的 IpType 插件

安装: 565

依赖项: 0

建议者: 0

安全性: 0

星标: 8

关注者: 1

分支: 0

公开问题: 0

类型:cakephp-plugin

3.0 2015-12-04 18:37 UTC

This package is auto-updated.

Last update: 2024-09-26 00:14:37 UTC


README

描述

这是一个为 CakePHP 数据库框架设计的 IpType,可以将表示为人类可读字符串的原始 IP 地址(127.0.0.1、::1)转换为使用 inet_pton 存储到数据库中的字节字符串。

数据库中的最终转换值应存储为 LOB 值。我使用了 16 字节的 VARBINARY,这对于 IPv6 地址也足够长。

此类是为 InnoGames GmbH 的应用程序编写的。已获得将此类公开的许可。

安装

您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。

安装 composer 包的推荐方法是

composer require thefredfox/cakephp-ip-type

之后,您需要在应用程序的引导文件中加载插件并将数据库类型映射如下

// in bootstrap file

Plugin::load('IpType');
Type::map('ip', 'IpType\Database\Type\IpType');

在 Table 类本身中,您需要告诉列的类型为这种类型

// in your Entity Table class (eg. UsersTable)

use Cake\Database\Schema\Table as Schema;

protected function _initializeSchema(Schema $schema) {
    $schema->columnType('ip', 'ip');
    return $schema;
}

配置

默认的编码和解码函数是 'inet_pton' 和 'inet_ntop'。但是,可以将编码(toDatabase)和解码(toPHP)方法设置为可调用的。

如果变量不是可调用的,将抛出 \UnexpectedValueException 异常,消息为:“无法解码值,IpType::_decode 必须是可调用的。”或“...编码...IpType::_encode...”。

方法字符串

// in bootstrap file

/** @var IpType $ipType */
$ipType = Type::build('ip');
$ipType->_encode = 'ip2long'; // using global ip2long method for encoding (just IPv4 support)
$ipType->_decode = 'long2ip'; // using global long2ip method for decoding (just IPv4 support)

自定义函数

// in bootstrap file

/** @var IpType $ipType */
$ipType = Type::build('ip');
$ipType->_encode = function ($value) {
    return $value . '1'; // just concatenate a '1' at the end, for what reason ever
};
$ipType->_decode = function ($value) {
    return $value;
};

类的静态函数

class TestClass {
    public static function staticEncode($value) { /*...*/ }
    public static function staticDecode($value) { /*...*/ }
}

/** @var IpType $ipType */
$ipType = Type::build('ip');
$ipType->_encode = 'TestClass::staticEncode';
$ipType->_decode = 'TestClass::staticDecode';

通过包装函数的类的非静态函数

class TestClass {
    public function encode($value) { /*...*/ }
    public function decode($value) { /*...*/ }
}

/** @var IpType $ipType */
$ipType = Type::build('ip');
$ipType->_encode = function ($value) {
   $object = new TestClass();
   return $object->encode($value);
};
$ipType->_decode = function ($value) {
   $object = new TestClass();
   return $object->decode($value);
};

数据库

数据库中的最终转换值应存储为 LOB 值。我使用了 16 字节的 VARBINARY,这对于 IPv6 地址也足够长。