agusrisan/countries

PHP 国家和货币

v1.1.0 2024-07-10 08:02 UTC

This package is auto-updated.

Last update: 2024-09-10 08:17:05 UTC


README

国家

World Map

Latest Stable Version License Code Quality Build

Coverage PHP Downloads StyleCI

它为你提供了什么?

此包包含有关国家的各种信息

地质和拓扑地图

在众多其他信息中,你可以绘制国家地图

Switzerland

要求

  • PHP 7.0+

安装

使用 Composer 安装

composer require agusrisan/countries

实例化

use PragmaRX\Countries\Package\Countries;

$countries = new Countries();

echo $countries->where('cca2', 'IT')->first()->hydrateCurrencies()->currencies->EUR->coins->frequent->first();

// or calling it statically

echo Countries::where('cca2', 'IT')->first()->hydrateCurrencies()->currencies->EUR->coins->frequent->first();

应该都返回

€1

覆盖默认配置

use PragmaRX\Countries\Package\Services\Config;

$countries = new Countries(new Config([
    'hydrate' => [
        'elements' => [
            'currencies' => true,
            'flag' => true,
            'timezones' => true,
        ],
    ],
]));

用法

此包与 Laravel 无关,也不需要安装 Laravel(我们有一个桥梁用于此目的),但它在其核心中包含Laravel 集合,集合中的所有方法都可用,这样你可以进行过滤、映射、归约、搜索、排序、拒绝等操作。实际上,它使用Coollection,这是一个具有流畅语法的 Laravel 集合,允许我们通过对象属性访问数组键(和值)。

要获取数据库中所有国家的信息,只需

use PragmaRX\Countries\Package\Countries;

$countries = new Countries();

$all = $countries->all();

要获取 JSON,则

return $countries->toJson();

通过键和值进行筛选

$countries->where('name.common', 'Brazil');

您可以通过其通用名称找到巴西,该名称是

#items: array:22 [▼
  "name" => array:3 [▼
    "common" => "Brazil"
    "official" => "Federative Republic of Brazil"
    "native" => array:1 [▼
      "por" => array:2 [▼
        "official" => "República Federativa do Brasil"
        "common" => "Brasil"
      ]
    ]
  ]

或者您也可以这样筛选

$countries->whereNameCommon('Brazil');

并且您可以更深入地

$countries->where('name.native.por.common', 'Brasil');

或者通过国家顶级域名进行搜索

$countries->where('tld.0', '.ch');

要获取

"name" => array:3 [▼
  "common" => "Switzerland"
  "official" => "Swiss Confederation"
  "native" => array:4 [▶]
]
"tld" => array:1 [▼
  0 => ".ch"
]

并使用 pluck 等类似功能

$countries->where('cca3', 'USA')->first()->hydrateStates()->states->pluck('name', 'postal')->toArray();

要获取

"MA" => "Massachusetts"
"MN" => "Minnesota"
"MT" => "Montana"
"ND" => "North Dakota"
...

此包使用一个修改后的集合,允许您像对象一样访问属性和方法

$countries->where('cca3', 'FRA')
         ->first()
         ->borders
         ->first()
         ->name
         ->official;

应该给出

Principality of Andorra

默认情况下禁用边界的自动填充,但您可以通过调用 hydrate 方法轻松地自动填充边界

$countries->where('name.common', 'United Kingdom')
         ->hydrate('borders')
         ->first()
         ->borders
         ->reverse()
         ->first()
         ->name
         ->common;

应该返回

Ireland

自动填充

为了提高性能,默认启用的自动填充可以在大多数国家属性上禁用,以下是如何手动填充属性

$countries->where('name.common', 'United States')->first()->hydrate('timezones')->timezones->first()->zone_name;

$countries->where('name.common', 'United States')->first()->hydrate('timezones')->timezones->first()->zone_name;

以下是一些可自动填充的属性

  • 边界
  • 城市
  • 货币
  • 国旗
  • 几何形状
  • 语言
  • 税收
  • 时区
  • 拓扑结构

额外的 WHERE 规则

某些属性存储方式不同,因此我们需要特殊的规则来访问它们,这些属性包括

  • ISO639_3 => 3 位语言代码。
  • ISO4217 => 3 位货币代码。

您当然可以像访问其他属性一样访问它们

$countries->whereISO639_3('por')->count();
$countries->where('ISO639_3', 'por')->count();

映射

有时您可能希望通过不同的名称访问一个属性,这可以在设置中完成,如下所示

'maps' => [
    'lca3' => 'ISO639_3'
]

在这里,我们将 ISO 格式的语言 3 位短码绑定到 lca3,它是 language code alpha 3-letter 的缩写。因此,现在我们可以通过以下方式访问属性

$countries->whereLca3('por');

或者

$countries->where('lca3', 'por');

以下是来自 Laravel News 和其他贡献者的其他示例

生成带有代码、本地名称和通用的所有国家的列表

app(PragmaRX\Countries\Package\Countries::class)
->all()
->map(function ($country) {
    $commonName = $country->name->common;

    $languages = $country->languages ?? collect();

    $language = $languages->keys()->first() ?? null;

    $nativeNames = $country->name->native ?? null;

    if (
        filled($language) &&
            filled($nativeNames) &&
            filled($nativeNames[$language]) ?? null
    ) {
        $native = $nativeNames[$language]['common'] ?? null;
    }

    if (blank($native ?? null) && filled($nativeNames)) {
        $native = $nativeNames->first()['common'] ?? null;
    }

    $native = $native ?? $commonName;

    if ($native !== $commonName && filled($native)) {
        $native = "$native ($commonName)";
    }

    return [$country->cca2 => $native];
})
->values()
->toArray();

应给出 267(或更多)个国家,例如

"AW" => "Aruba"
"AF" => "افغانستان (Afghanistan)"
"AO" => "Angola"
"AI" => "Anguilla"
"AX" => "Åland (Åland Islands)"
"AL" => "Shqipëria (Albania)"
"AD" => "Andorra"
"AE" => "دولة الإمارات العربية المتحدة (United Arab Emirates)"
"AR" => "Argentina"
"AM" => "Հայաստան (Armenia)"
"AS" => "American Samoa"
"AQ" => "Antarctica"
"TF" => "Terres australes et antarctiques françaises (French Southern and Antarctic Lands)"
"AG" => "Antigua and Barbuda"
"AU" => "Australia"
"AT" => "Österreich (Austria)"
"AZ" => "Azərbaycan (Azerbaijan)"
"BI" => "Burundi"
"BE" => "Belgien (Belgium)"
"BJ" => "Bénin (Benin)"
"BF" => "Burkina Faso"
"BD" => "বাংলাদেশ (Bangladesh)"
"BG" => "България (Bulgaria)"
"BH" => "‏البحرين (Bahrain)"
"BS" => "Bahamas"
"BA" => "Bosna i Hercegovina (Bosnia and Herzegovina)"
"BL" => "Saint-Barthélemy (Saint Barthélemy)"
"SH" => "Saint Helena, Ascension and Tristan da Cunha"
"BY" => "Белару́сь (Belarus)"
"BZ" => "Belize"
"BM" => "Bermuda"
"BO" => "Wuliwya (Bolivia)"
"BQ" => "Caribisch Nederland (Caribbean Netherlands)"
"BR" => "Brasil (Brazil)"
"BB" => "Barbados"
"BN" => "Negara Brunei Darussalam (Brunei)"
"BT" => "འབྲུག་ཡུལ་ (Bhutan)"
"BV" => "Bouvetøya (Bouvet Island)"
"BW" => "Botswana"
"CF" => "République centrafricaine (Central African Republic)"
"CA" => "Canada"
"CC" => "Cocos (Keeling) Islands"
"CH" => "Suisse (Switzerland)"
"CL" => "Chile"
"CN" => "中国 (China)"
"CI" => "Côte d'Ivoire (Ivory Coast)"
"CM" => "Cameroon"
"CD" => "RD Congo (DR Congo)"
"CG" => "République du Congo (Republic of the Congo)"
"CK" => "Cook Islands"
"CO" => "Colombia"
"KM" => "القمر‎ (Comoros)"
"CV" => "Cabo Verde (Cape Verde)"
...

生成国家的列表

$countries->all()->pluck('name.common')->toArray();

返回

[
    "Aruba",
    "Afghanistan",
    "Angola",
    "Anguilla",
    "Åland Islands",
    ....

生成货币列表

$countries->all()->pluck('currencies')->toArray();

返回

[
  [
    "AWG",
  ],
  [
    "AFN",
  ],
  [
    "AOA",
  ],
  [
    "XCD",
  ],
  [
    "EUR",
  ],
  ....

获取货币符号

$countries->where('name.common', 'Brazil')->first()->hydrate('currencies')->currencies->BRL->units->major->symbol;

生成州列表

$countries->where('name.common', 'United States')
    ->first()
    ->hydrateStates()
    ->states
    ->sortBy('name')
    ->pluck('name', 'postal');

返回

[
    "AL": "Alabama",
    "AK": "Alaska",
    "AZ": "Arizona",
    "AR": "Arkansas",
    "CA": "California",
    ....
    ....

自动填充并获取城市

$countries->where('cca3', 'FRA')
    ->first()
    ->hydrate('cities')
    ->cities
    ->paris
    ->timezone;

应该返回

Europe/Paris

获取国家的货币

$countries->where('name.common', 'United States')->first()->currencies;

返回

[{
    "alternativeSigns": [],
    "ISO4217Code": "USD",
    "ISO4217Number": "840",
    "sign": "$",
    "subunits": 100,
    "title": "U.S. dollar",
    ....

获取所有货币

$countries->currencies();

返回

[
    0 => "AED"
    1 => "AFN"
    2 => "ALL"
    3 => "AMD"
    4 => "ANG"
    5 => "AOA"
    6 => "ARS"
    7 => "AUD"
    8 => "AWG"
    9 => "AZN"
    10 => "BAM"
    ....

获取州的时区

return $countries->where('name.common', 'United States')->first()->timezone->NC;

返回

America/New_York

获取国家的所有时区

$countries->where('name.common', 'Brazil')
  ->first()
  ->hydrateTimezones()
  ->timezones
  ->map(function ($timezone) {
      return $timezone->zone_name;
  })->values()
  ->unique()
  ->toArray();

获取时区的所有时间

return $countries->where('name.common', 'United States Virgin Islands')->first()->hydrate('timezones_times')->timezones->first()->times;

返回

"times" => [
    "abbreviation" => "LMT"
    "dst" => "0"
    "gmt_offset" => "-14764"
    "time_start" => "-1825098837"
    "zone_id" => "415"
    1 => [
        "abbreviation" => "AST"
        "dst" => "0"
        "gmt_offset" => "-14400"
        "time_start" => "-1825098836"
        "zone_id" => "415"
    ]
]

国旗

Countries 提供了多种国旗来源,包括 SVG 国旗。这是使用可用来源之一的方式

安装 flag-icon

npm install --save-dev flag-icon-css

将其导入到您的项目中

@import '~flag-icon-css/sass/flag-icon.scss';

使用 Countries 获取国旗 span

$unitedStatesFlag =
    $this->countries->where('cca3', 'USA')
    ->first()
    ->flag
    ->flag_icon;

在您的blade模板中渲染它

{!! $unitedStatesFlag !!}

发布资源

您可以通过以下方式发布配置:

php artisan vendor:publish --provider=PragmaRX\\Countries\\ServiceProvider

数据

来源

此包使用了一些其他开源包,直到我们构建更好的文档为止,您可以在 mledoze/countries 上找到更多关于数据的信息,以及如何在 Laravel News 文章 中使用它。

请查看版权部分,了解此包所使用的完整包列表。

更新

警告

此项目中的所有数据文件(JSON、图片、图标等)都无法手动更新。 我们将关闭所有需要手动更新这些文件的分支请求,因为更新脚本无论如何都会删除它们。

如果您发现数据存在问题,请向包管理器(列出的数据来源和版权部分)提出修复请求,然后您可以自行运行更新脚本来在此存储库中正确更新它们。

update.php

此包包含update.php脚本,您必须使用它来更新数据文件。它将从所有包中下载所有信息,并自动构建.json(以及一些其他如.svg的文件)。以下是操作步骤:

cd vendor/pragmarx/countries
composer install
php update.php

然后等待一个非常长的时间*(有时看起来好像卡住了,但实际上并没有)直到它完成所有重建,然后只需要进行暂存、提交、推送所有重新生成的文件,然后草拟一个新的PR。

缓存

由于这些数据不应该改变,调用会自动缓存。如果您想更改这种行为,可以在发布后编辑config/countries.php文件。

框架桥梁

示例文件

作者

Antonio Carlos Ribeiro 所有贡献者

版权

为了构建国家数据库和关系,此包使用以下来源和包:

许可

Countries遵循BSD 3-Clause License许可 - 请参阅LICENSE文件以获取详细信息。

贡献

欢迎提交拉取请求和问题。