v0.7.1
2015-10-05 15:40 UTC
Requires
- php: >=5.4.0
- commerceguys/addressing: ~0.5
- doctrine/collections: ~1.0
Requires (Dev)
- mikey179/vfsstream: 1.*
- phpunit/phpunit: ~4.0
- symfony/intl: >=2.3
README
A PHP 5.4+ 区域管理库。需要 commerceguys/addressing。
区域通常是用于运输或税务目的的地理分组。例如,一组与区域相关的运输费用,只有当客户的地址与区域匹配时,费用才可用。
区域可以匹配其他区域、国家、次级区域(州/省/市镇)、邮政编码。邮政编码也可以用范围或正则表达式表示。
区域示例
- 加利福尼亚州和内华达州
- 比利时、荷兰、卢森堡
- 欧盟
- 德国和一组奥地利邮政编码(6691, 6991, 6992, 6993)
- 奥地利(无特定邮政编码:6691, 6991, 6992, 6993)
数据模型
每个 区域 都有 区域成员。如果一个区域成员与提供的地址匹配,则该区域匹配提供的地址。
基本接口不强制使用设置器,因为服务类不需要。扩展接口(ZoneEntityInterface、ZoneMemberEntityInterface)也提供了此目的,以及匹配 Zone 和 ZoneMember 类,这些类可以用作示例或由Doctrine映射。
库包含两种类型的区域成员
use CommerceGuys\Addressing\Model\Address; use CommerceGuys\Zone\Model\Zone; use CommerceGuys\Zone\Model\ZoneMemberCountry; $zone = new Zone(); $zone->setId('german_vat'); $zone->setName('German VAT'); $zone->setScope('tax'); // Create the German VAT zone (Germany and 4 Austrian postal codes). $germanyZoneMember = new ZoneMemberCountry(); $germanyZoneMember->setCountryCode('DE'); $zone->addMember($germanyZoneMember); $austriaZoneMember = new ZoneMemberCountry(); $austriaZoneMember->setCountryCode('AT'); $austriaZoneMember->setIncludedPostalCodes('6691, 6991:6993'); $zone->addMember($austriaZoneMember); // Check if the provided austrian address matches the German VAT zone. $austrianAddress = new Address(); $austrianAddress = $austrianAddress ->withCountryCode('AT') ->withPostalCode('6692'); echo $zone->match($austrianAddress); // true
匹配器
提供了一个匹配器类,用于在地址应与系统中的所有区域匹配的情况,按优先级排序匹配的区域。
use CommerceGuys\Addressing\Model\Address; use CommerceGuys\Zone\Matcher\ZoneMatcher; use CommerceGuys\Zone\Repository\ZoneRepository; // Initialize the default repository which loads zones from json files stored in // resources/zone. A different repository might load them from the database, etc. $repository = new ZoneRepository('resources/zone'); $matcher = new ZoneMatcher($repository); $austrianAddress = new Address(); $austrianAddress = $austrianAddress ->withCountryCode('AT') ->withPostalCode('6692'); // Get all matching zones. $zones = $matcher->matchAll($austrianAddress); // Get all matching zones for the 'tax' scope. $zones = $matcher->matchAll($austrianAddress, 'tax'); // Get the best matching zone. $zone = $matcher->match($austrianAddress); // Get the best matching zone for the 'shipping' scope. $zone = $matcher->match($austrianAddress, 'shipping');