thefredfox / cakephp-ip-type
CakePHP 的 IpType 插件
3.0
2015-12-04 18:37 UTC
Requires
- php: >=5.4.16
- cakephp/cakephp: ~3.0
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 地址也足够长。