Una biblioteca de direcciones PHP 8.0+, impulsada por CLDR y los datos de direcciones de Google.
Manipula direcciones postales, destinadas a identificar una ubicación precisa del destinatario para fines de envío o facturación.
Características:
Los formatos y subdivisiones de direcciones se generaron inicialmente a partir del Servicio de datos de direcciones de Google y ahora son propiedad de la biblioteca y son mantenidos por ella.
Consulte también Commerceguys/intl para conocer idiomas, monedas y formato de números basados en CLDR.
La interfaz de dirección representa una dirección postal, con captadores para los siguientes campos:
Los nombres de los campos siguen el estándar OASIS eXtensible Address Language (xAL).
La interfaz no hace suposiciones sobre la mutabilidad. La aplicación de implementación puede ampliar la interfaz para proporcionar configuradores o implementar un objeto de valor que utilice el estilo PSR-7 con* mutadores o dependa de un AddressBuilder. Se proporciona un objeto de valor de dirección predeterminado que puede usarse como ejemplo o mapearse mediante Doctrine (preferiblemente como integrable).
El formato de dirección proporciona la siguiente información:
El país proporciona la siguiente información:
La subdivisión proporciona la siguiente información:
Las subdivisiones son jerárquicas y pueden tener hasta tres niveles: Área Administrativa -> Localidad -> Localidad Dependiente.
use CommerceGuys Addressing AddressFormat AddressFormatRepository ;
use CommerceGuys Addressing Country CountryRepository ;
use CommerceGuys Addressing Subdivision SubdivisionRepository ;
$ countryRepository = new CountryRepository ();
$ addressFormatRepository = new AddressFormatRepository ();
$ subdivisionRepository = new SubdivisionRepository ();
// Get the country list (countryCode => name), in French.
$ countryList = $ countryRepository -> getList ( ' fr-FR ' );
// Get the country object for Brazil.
$ brazil = $ countryRepository -> get ( ' BR ' );
echo $ brazil -> getThreeLetterCode (); // BRA
echo $ brazil -> getName (); // Brazil
echo $ brazil -> getCurrencyCode (); // BRL
print_r ( $ brazil -> getTimezones ());
// Get all country objects.
$ countries = $ countryRepository -> getAll ();
// Get the address format for Brazil.
$ addressFormat = $ addressFormatRepository -> get ( ' BR ' );
// Get the subdivisions for Brazil.
$ states = $ subdivisionRepository -> getAll ([ ' BR ' ]);
foreach ( $ states as $ state ) {
$ municipalities = $ state -> getChildren ();
}
// Get the subdivisions for Brazilian state Ceará.
$ municipalities = $ subdivisionRepository -> getAll ([ ' BR ' , ' CE ' ]);
foreach ( $ municipalities as $ municipality ) {
echo $ municipality -> getName ();
}
Las direcciones tienen el formato de dirección, en HTML o texto.
Formatea una dirección para mostrarla y siempre agrega el nombre del país localizado.
use CommerceGuys Addressing Address ;
use CommerceGuys Addressing Formatter DefaultFormatter ;
use CommerceGuys Addressing AddressFormat AddressFormatRepository ;
use CommerceGuys Addressing Country CountryRepository ;
use CommerceGuys Addressing Subdivision SubdivisionRepository ;
$ addressFormatRepository = new AddressFormatRepository ();
$ countryRepository = new CountryRepository ();
$ subdivisionRepository = new SubdivisionRepository ();
$ formatter = new DefaultFormatter ( $ addressFormatRepository , $ countryRepository , $ subdivisionRepository );
// Options passed to the constructor or format() allow turning off
// html rendering, customizing the wrapper element and its attributes.
$ address = new Address ();
$ address = $ address
-> withCountryCode ( ' US ' )
-> withAdministrativeArea ( ' CA ' )
-> withLocality ( ' Mountain View ' )
-> withAddressLine1 ( ' 1098 Alta Ave ' );
echo $ formatter -> format ( $ address );
/** Output:
<p translate="no">
<span class="address-line1">1098 Alta Ave</span><br>
<span class="locality">Mountain View</span>, <span class="administrative-area">CA</span><br>
<span class="country">United States</span>
</p>
**/
Se ocupa de los campos en mayúsculas cuando el formato lo requiere (para facilitar la clasificación automática del correo).
Requiere especificar el código del país de origen, permitiendo diferenciar entre correo nacional e internacional. En el caso de correo nacional, el nombre del país no se muestra en absoluto. En caso de correo internacional:
use CommerceGuys Addressing Address ;
use CommerceGuys Addressing Formatter PostalLabelFormatter ;
use CommerceGuys Addressing AddressFormat AddressFormatRepository ;
use CommerceGuys Addressing Country CountryRepository ;
use CommerceGuys Addressing Subdivision SubdivisionRepository ;
$ addressFormatRepository = new AddressFormatRepository ();
$ countryRepository = new CountryRepository ();
$ subdivisionRepository = new SubdivisionRepository ();
// Defaults to text rendering. Requires passing the "origin_country"
// (e.g. 'FR') to the constructor or to format().
$ formatter = new PostalLabelFormatter ( $ addressFormatRepository , $ countryRepository , $ subdivisionRepository , [ ' locale ' => ' fr ' ]);
$ address = new Address ();
$ address = $ address
-> withCountryCode ( ' US ' )
-> withAdministrativeArea ( ' CA ' )
-> withLocality ( ' Mountain View ' )
-> withAddressLine1 ( ' 1098 Alta Ave ' );
echo $ formatter -> format ( $ address , [ ' origin_country ' => ' FR ' ]);
/** Output:
1098 Alta Ave
MOUNTAIN VIEW, CA 94043
ÉTATS-UNIS - UNITED STATES
**/
La validación de direcciones se basa en la biblioteca Symfony Validator.
Comprobaciones realizadas:
use CommerceGuys Addressing Address ;
use CommerceGuys Addressing Validator Constraints AddressFormatConstraint ;
use CommerceGuys Addressing Validator Constraints CountryConstraint ;
use Symfony Component Validator Validation ;
$ address = new Address ( ' FR ' );
$ validator = Validation :: createValidator ();
// Validate the country code, then validate the rest of the address.
$ violations = $ validator -> validate ( $ address -> getCountryCode (), new CountryConstraint ());
if (! $ violations -> count ()) {
$ violations = $ validator -> validate ( $ address , new AddressFormatConstraint ());
}
Las zonas son agrupaciones territoriales que se utilizan a menudo con fines de envío o impuestos. Por ejemplo, un conjunto de tarifas de envío asociadas con una zona donde las tarifas están disponibles solo si la dirección del cliente pertenece a la zona.
Una zona puede coincidir con países, subdivisiones (estados/provincias/municipios) y códigos postales. Los códigos postales también se pueden expresar mediante rangos o expresiones regulares.
Ejemplos de zonas:
use CommerceGuys Addressing Address ;
use CommerceGuys Addressing Zone Zone ;
// Create the German VAT zone (Germany and 4 Austrian postal codes).
$ zone = new Zone ([
' id ' => ' german_vat ' ,
' label ' => ' German VAT ' ,
' territories ' => [
[ ' country_code ' => ' DE ' ],
[ ' country_code ' => ' AT ' , ' included_postal_codes ' => ' 6691, 6991:6993 ' ],
],
]);
// Check if the provided austrian address matches the German VAT zone.
$ austrianAddress = new Address ();
$ austrianAddress = $ austrianAddress
-> withCountryCode ( ' AT ' )
-> withPostalCode ( ' 6992 ' );
echo $ zone -> match ( $ austrianAddress ); // true