整理 IPIP.net 和 QQ IP 数据库纯真版 为符合中华人民共和国行政区划代码的国家与地区、省或直辖市、地级市或省管县级市地址。
在 IPIP.net 库的基础上去掉 IDC/ISP 数据补上纯真 IP 库的数据,然后生成下列四个库:
Requirements ¶
通过 composer 安装
composer require larryli/ipv4
Usage ¶
别名 ¶
可以在 `
config`
文件先定义一个别名:
Yii::setAlias('@ipv4', (dirname(__DIR__) . '/vendor/larryli/ipv4');
组件 ¶
在 `
components`
中增加:
// ipv4 component
'ipv4' => [
'class' => 'larryli\ipv4\yii2\IPv4',
'runtime' => '@runtime',
'database' => 'larryli\ipv4\yii2\Database',
// query config
'providers' => [
'monipdb', // empty
'qqwry',
'full' => ['monipdb', 'qqwry'], // ex. 'monipdb', 'qqwry', ['qqwry', 'monipdb']
'mini' => 'full', // ex. ['monipdb', 'qqwry'], 'monipdb', 'qqwry', ['qqwry', 'monipdb']
'china' => 'full',
'world' => 'full',
'freeipip',
],
],
其中:
命令 ¶
在 `
config数组中增加
controllerMap`
配置内容:
// ipv4 command
'ipv4' => [
'class' => 'larryli\ipv4\yii2\commands\Ipv4Controller',
],
使用:
./yii help ipv4
可以查看 ipv4 命令列表。
数据库迁移 ¶
复制数据库迁移脚本到当前 `
@app/migrations`
下:
cp vendor/larryli/ipv4/src/yii2/migrations/*.php migrations/
或者参见此页面的说明使用其他的方式处理。
然后,执行迁移:
./yii migrate/up
初始化 ¶
./yii ipv4/init
使用组件调用 ¶
use Yii;
Yii::$app->get('ipv4')->get('full')->find(ip2long('127.0.0.1'));
使用模型调用 ¶
仅支持生成的数据库 `
larryli\ipv4\query\DatabaseQuery`
查询。
使用 yii2 模型可以不需要配置 ipv4 组件,但必须先使用 ipv4 组件生成好相关数据库。
也就是说,可以只在 console 应用中配置 ipv4 组件;然后在 web 应用中不配置 ipv4 组件直接使用相关模型。
Division 模型 ¶
namespace app\models;
use larryli\ipv4\yii2\models\Division as BaseDivision;
/**
* Class Division
* @package app\models
*/
class Division extends BaseDivision
{
/**
* @inheritdoc
*/
public static function tableName()
{
return "{{%ipv4_divisions}}";
}
}
使用 `
tableName静态方法可以重载掉父类中调用组件查询
prefix`
的代码。
Full/Mini/China/World 模型 ¶
namespace app\models;
use larryli\ipv4\yii2\models\Index;
/**
* Class Full
* @package app\models
*
* @property string $ip
* @property Division $division
*/
abstract class Full extends Index
{
/**
* @return string
*/
static public function divisionClassName()
{
return Division::className();
}
/**
* @inheritdoc
*/
public static function tableName()
{
return '{{%ipv4_full}}';
}
}
使用 `
divisionClassName静态方法可以重载掉
Division父类中调用组件查询
prefix`
的代码。
仅需要声明所需使用的查询模型即可。
查询:
$model = Full::findOneByIp(ip2long('127.0.0.1'));
if (!empty($model) && !empty(!$model->division)) {
echo $model->division->name;
}
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.