API Reference
Last updated: 2026-03-22
Quick reference for key classes, methods, and interfaces in Filament Address Pro.
Table of Contents
Models
Address
Location: Models\Address
Polymorphic address model with verification tracking.
Properties
// Primary key
string $id // ULID
// Polymorphic relationship
string $addressable_type
string $addressable_id
// Label
?string $label // Home, Work, Billing, Shipping, etc.
// Country and subdivisions
string $country_code // ISO 2-letter code
?string $administrative_area_id // State/province ULID
?string $administrative_area // Text fallback
?string $locality_id // City ULID
string $locality // City or town name
?string $dependent_locality_id // District ULID
?string $dependent_locality // Ward, neighborhood, or suburb
// Street address
string $address_line_1 // Required, max 255 chars
?string $address_line_2 // Optional, max 100 chars
?string $postal_code
// Additional fields
?string $bldg // Building or company name
?string $box // PO Box number
?string $ico // In care of recipient
// Geographic coordinates
?float $lat // Latitude
?float $lon // Longitude
// Status flags
bool $is_primary // One per entity (default: false)
bool $is_verified // Verified by an external service (default: false)
bool $needs_review // Verification found suggested changes pending user review (default: false)
// Verification tracking
?string $verification_provider // usps, google, smarty
?Carbon $verified_at // When verification occurred
?array $verification_metadata // Raw response + context (e.g. ['context' => 'map_selection'])
// Quality
?int $quality_score // 0–100 (auto-calculated on save)
// Timestamps
Carbon $created_at
Carbon $updated_atRelationships
// Polymorphic relationship to owner (User, Customer, etc.)
public function addressable(): MorphTo
// Country relationship
public function country(): BelongsTo
// Subdivision relationships
public function administrativeArea(): BelongsTo
public function locality(): BelongsTo
public function dependentLocality(): BelongsToScopes
// Verification
Address::verified()->get(); // is_verified = true
Address::unverified()->get(); // is_verified = false
Address::verifiedBy('usps')->get(); // verified by specific provider
// Review workflow
Address::where('needs_review', true)->get(); // pending user review
// Quality
Address::whereQuality('excellent')->get(); // excellent, good, fair, poor, very_poor
Address::minimumQuality(60)->get(); // quality_score >= 60
Address::needsQualityImprovement()->get(); // quality_score < 60 (configurable threshold)Methods
// Check if address is verified
public function isVerified(): bool
// Mark address as verified
public function markAsVerified(
string $provider,
?array $metadata = null
): self
// Get formatted address (international format)
public function getFormattedAttribute(): string
// Get formatted address (domestic format)
public function getFormattedLocalAttribute(): stringExample Usage
use Viewflex\FilamentAddress\Models\Address;
// Create an address
$address = Address::create([
'addressable_type' => 'App\Models\User',
'addressable_id' => 1,
'country_code' => 'US',
'address_line_1' => '1600 Pennsylvania Ave NW',
'locality' => 'Washington',
'administrative_area' => 'District of Columbia',
'postal_code' => '20500',
'lat' => 38.8977,
'lon' => -77.0365,
'is_primary' => true,
]);
// Mark as verified
$address->markAsVerified('usps', [
'delivery_point' => 'confirmed',
'dpv_match' => 'Y',
]);
// Get formatted address
echo $address->formatted; // International format with country
echo $address->formatted_local; // Domestic format without countryCountry
Location: Models\Country
Country with subdivisions and address definition.
Properties
string $code // ISO 2-letter code
string $name // Full country name
?string $iso3 // ISO 3-letter code
?string $numeric_code // ISO numeric code
?string $phone_code // International dialing code
?string $capital
?string $currency
?string $currency_name
?string $currency_symbol
?string $tld // Top-level domain
?string $region // Geographic region
?string $subregion
bool $is_sovereign // vs. territory
?string $parent_code // For territoriesRelationships
// Country's subdivisions (states, provinces)
public function subdivisions(): HasMany
// Active subdivisions only
public function activeSubdivisions(): HasMany
// Address definition (format configuration)
public function addressDefinition(): HasOne
// Parent country (for territories)
public function parent(): BelongsTo
// Territory relationships
public function territories(): HasMany
// Country groups (EU, ASEAN, etc.)
public function groups(): BelongsToManyMethods
// Get actual subdivision depth (1, 2, or 3)
public function getActualSubdivisionDepth(): int
// Get subdivision counts by level
public function getSubdivisionCountsByLevel(): arrayServices
GeocodingService
Location: Viewflex\FilamentAddress\Services\GeocodingService
Main service for geocoding and address component extraction.
Constructor
public function __construct(
AddressVerificationService $verificationService,
AddressExtractorRegistry $extractorRegistry
)Methods
geocode()
Forward geocoding: converts address to coordinates and components.
public function geocode(string $address, string $countryCode): array
// Parameters:
// - $address: Full address string
// - $countryCode: ISO 2-letter country code
// Returns:
[
'success' => bool,
'lat' => ?float,
'lon' => ?float,
'formatted_address' => ?string,
'components' => [
'address_line_1' => string,
'address_line_2' => ?string,
'city' => string,
'state' => string,
'state_abbr' => ?string,
'postal_code' => string,
'country_code' => string,
'dependent_locality' => ?string,
'is_verified' => bool,
'verification_provider' => ?string,
'verified_at' => ?string,
'verification_metadata' => ?array,
],
'error' => ?string,
]Example:
$geocoder = app(GeocodingService::class);
$result = $geocoder->geocode('1600 Pennsylvania Ave NW', 'US');
if ($result['success']) {
$address = Address::create([
'country_code' => $result['components']['country_code'],
'address_line_1' => $result['components']['address_line_1'],
'locality' => $result['components']['city'],
'administrative_area' => $result['components']['state'],
'postal_code' => $result['components']['postal_code'],
'lat' => $result['lat'],
'lon' => $result['lon'],
'is_verified' => $result['components']['is_verified'],
'verification_provider' => $result['components']['verification_provider'],
]);
}reverseGeocode()
Reverse geocoding: converts coordinates to address.
public function reverseGeocode(float $lat, float $lon): array
// Parameters:
// - $lat: Latitude
// - $lon: Longitude
// Returns: Same structure as geocode()Example:
$result = $geocoder->reverseGeocode(38.8977, -77.0365);
if ($result['success']) {
echo "Address: " . $result['formatted_address'];
echo "City: " . $result['components']['city'];
echo "Country: " . $result['components']['country_code'];
}extractComponents()
Extract address components from Google's address_components array.
public function extractComponents(
array $addressComponents,
string $countryCode
): array
// Uses country-specific extractors:
// - JapaneseAddressExtractor for JP
// - GreeceAddressExtractor for GR
// - ConfigBasedAddressExtractor for KR, CN
// - DefaultAddressExtractor for all othersCountryService
Location: Services\CountryService
Static utility methods for country and address operations.
Methods
validatePostalCode()
Validate a postal code against a regex pattern. Pass the pattern from CountryAddressDefinition::postal_code_regex.
public static function validatePostalCode(
?string $pattern,
?string $postalCode
): bool
// Examples:
$pattern = Country::where('iso2', 'US')->first()->addressDefinition->postal_code_regex;
CountryService::validatePostalCode($pattern, '20500'); // true
CountryService::validatePostalCode($pattern, 'invalid'); // false
// Returns true when pattern is null (country has no postal code format constraint)
CountryService::validatePostalCode(null, 'anything'); // truegetAdministrativeAreaOptions()
Get state/province options for dropdown.
public static function getAdministrativeAreaOptions(
string $countryCode
): array
// Returns: ['ulid' => 'State Name', ...]
$states = CountryService::getAdministrativeAreaOptions('US');
// ['01K7MTQ...' => 'New York', '01K7MTR...' => 'California', ...]getLocalityOptions()
Get city options for dropdown.
public static function getLocalityOptions(
string $countryCode,
?string $administrativeAreaId = null
): array
// Returns cities for given state/province
$cities = CountryService::getLocalityOptions('US', $stateId);getDependentLocalityOptions()
Get district/neighborhood options.
public static function getDependentLocalityOptions(
string $countryCode,
?string $localityId = null
): arrayformatAddress()
Format address in international format (with country).
public static function formatAddress(
string $countryCode,
array $addressData
): string
// $addressData supports these fields:
// - first_name: Recipient first name
// - last_name: Recipient last name
// - organization: Organization/company name
// - address_line_1: Street address (required)
// - address_line_2: Apartment, suite, etc. (optional)
// - postal_code: ZIP/postal code
// - administrative_area: State/province name or ID
// - locality: City name or ID
// - dependent_locality: District/neighborhood name or ID
// - bldg: Building number
// - box: PO Box
// - ico: In care of
// Example:
$formatted = CountryService::formatAddress('US', [
'first_name' => 'John',
'last_name' => 'Smith',
'address_line_1' => '1600 Pennsylvania Ave NW',
'locality' => 'Washington',
'administrative_area' => 'District of Columbia',
'postal_code' => '20500',
]);
// Output:
// John Smith
// 1600 Pennsylvania Ave NW
// Washington, District of Columbia 20500
// UNITED STATESformatAddressLocal()
Format address in domestic format (without country).
public static function formatAddressLocal(
string $countryCode,
array $addressData
): string
// Same parameters as formatAddress()
// Example output:
// John Smith
// 1600 Pennsylvania Ave NW
// Washington, DC 20500AddressProcessingService
Location: Viewflex\FilamentAddress\Services\AddressProcessingService
High-level service for processing addresses with batch support.
Methods
processFromAddress()
Process address from text input with geocoding and verification.
public function processFromAddress(
array $addressData
): AddressProcessingResult
// Parameters:
// - $addressData: Array with address_line_1, locality, administrative_area, postal_code, country_code
// Returns: AddressProcessingResult with success, components, metadataprocessFromCoordinates()
Process address from coordinates (reverse geocoding).
public function processFromCoordinates(
float $lat,
float $lon
): AddressProcessingResultprocessFromPlace()
Process address from Google Places selection.
public function processFromPlace(
array $placeData
): AddressProcessingResult
// Parameters:
// - $placeData: Array from Google Places API (name, lat, lon, postal_code, etc.)processBatch()
Process multiple addresses with rate limiting.
public function processBatch(
array $addresses,
?callable $progressCallback = null,
int $delayMs = 100
): array
// Example:
$results = $processor->processBatch(
addresses: $addressList,
progressCallback: function ($current, $total, $result) {
echo "Processing {$current}/{$total}...\n";
},
delayMs: 200 // Respect API rate limits
);getBatchStatistics()
Get statistics from batch processing results.
public function getBatchStatistics(array $results): array
// Returns:
[
'total' => int,
'successful' => int,
'failed' => int,
'verified' => int,
'success_rate' => float,
'verification_rate' => float,
]Traits
HasAddresses
Location: Viewflex\FilamentAddress\Concerns\HasAddresses
Add to models that have addresses.
Methods
// Relationship to all addresses
public function addresses(): MorphMany
// Get primary address
public function primaryAddress(): ?Address
// Get verified addresses only
public function verifiedAddresses(): Collection
// Check if has primary address
public function hasPrimaryAddress(): bool
// Check if has any verified addresses
public function hasVerifiedAddresses(): bool
// Set an address as primary (clears other primary flags)
public function setPrimaryAddress(Address $address): voidExample
use Viewflex\FilamentAddress\Concerns\HasAddresses;
class User extends Authenticatable
{
use HasAddresses;
}
// Usage
$user = User::find(1);
$primary = $user->primaryAddress();
$verified = $user->verifiedAddresses();
if ($user->hasPrimaryAddress()) {
echo "Primary: " . $primary->formatted;
}
// Set new primary
$newAddress = $user->addresses()->first();
$user->setPrimaryAddress($newAddress);Filament Components
AddressForm
Location: Viewflex\FilamentAddress\Filament\Schemas\AddressForm
Complete address form schema with all features.
Methods
// Get full address form schema
public static function schema(): array
// Returns array of Filament form components:
// - Country select
// - Address search field with Places autocomplete + map preview (if enabled)
// - Address line 1 & 2
// - State/city/district dropdowns (country-dependent)
// - Postal code
// - Additional fields (bldg, box, ico)
// - Live preview sectionExample
use Viewflex\FilamentAddress\Filament\Schemas\AddressForm;
use Filament\Forms\Form;
public static function form(Form $form): Form
{
return $form->schema([
...AddressForm::schema(),
]);
}AddressesRelationManager
Location: Viewflex\FilamentAddress\Filament\RelationManagers\AddressesRelationManager
Complete address management interface for Filament resources.
Features
- Create/edit/delete addresses
- Set primary address
- View verification status
- Search and filter
- Bulk actions
Example
use Viewflex\FilamentAddress\Filament\RelationManagers\AddressesRelationManager;
class CustomerResource extends Resource
{
public static function getRelations(): array
{
return [
AddressesRelationManager::class,
];
}
}Verification
AddressVerificationService
Location: Services\Verification\AddressVerificationService
Main verification service managing multiple providers.
Methods
// Verify an address
public function verify(
array $address,
?string $providerName = null
): VerificationResult
// Register a custom provider
public function registerProvider(VerificationProvider $provider): void
// Get all registered providers
public function getProviders(): array
// Get provider for specific country
public function getProviderForCountry(string $countryCode): ?VerificationProviderVerificationResult
Location: Services\Verification\VerificationResult
Standardized verification result.
Methods
// Check if verification was successful
public function isSuccessful(): bool
// Get provider name
public function getProvider(): ?string
// Should fall back to geocoding?
public function shouldFallbackToGeocoding(): bool
// Get error message
public function getError(): ?string
// Get all components
public function getComponents(): ?array
// Get metadata
public function getMetadata(): ?array
// Convenience methods
public function getAddressLine1(): ?string
public function getAddressLine2(): ?string
public function getCity(): ?string
public function getState(): ?string
public function getPostalCode(): ?string
public function getCountryCode(): ?string
public function getDistrict(): ?string
public function getLatitude(): ?float
public function getLongitude(): ?float
// Static factory methods
public static function success(
string $provider,
array $components,
?array $metadata = null
): self
public static function failure(
string $provider,
string $error,
bool $shouldFallbackToGeocoding = true
): selfVerificationProvider Interface
Location: Services\Verification\VerificationProvider
Interface for custom verification providers.
interface VerificationProvider
{
// Verify an address
public function verify(array $address): VerificationResult;
// Check if provider supports country
public function supportsCountry(string $countryCode): bool;
// Get provider name
public function getName(): string;
// Check if provider is properly configured
public function isConfigured(): bool;
}Extractors
AddressExtractorRegistry
Location: Viewflex\FilamentAddress\Services\Geocoding\AddressExtractorRegistry
Manages address component extractors with priority system.
Methods
// Register an extractor
public function register(
AddressComponentExtractorInterface $extractor
): self
// Get extractor for country (highest priority wins)
public function getExtractor(string $countryCode): ?AddressComponentExtractorInterface
// Clear all extractors
public function clear(): selfAddressComponentExtractorInterface
Location: Viewflex\FilamentAddress\Services\Geocoding\Contracts\AddressComponentExtractorInterface
Interface for address component extractors.
interface AddressComponentExtractorInterface
{
// Check if extractor supports country
public function supports(string $countryCode): bool;
// Get priority (higher = preferred)
// - 100: Custom extractors (JapaneseAddressExtractor)
// - 50: Config-based extractors
// - 0: Default extractor (fallback)
public function getPriority(): int;
// Extract components from Google's address_components
public function extract(array $addressComponents): array;
}Built-in Extractors
DefaultAddressExtractor
- Priority: 0 (fallback)
- Supports: All countries
- Format: Western/standard (street_number + route)
JapaneseAddressExtractor
- Priority: 100
- Supports: JP (Japan)
- Format: Hierarchical (premise + sublocality levels)
GreeceAddressExtractor
- Priority: 100
- Supports: GR (Greece)
- Format: Maps Google's non-standard admin levels to the correct Regional Unit / Municipality hierarchy
ConfigBasedAddressExtractor
- Priority: 50
- Supports: Countries configured in
config/addresses.php - Format: Defined in configuration
Example custom extractor:
use Viewflex\FilamentAddress\Services\Geocoding\Contracts\AddressComponentExtractorInterface;
class AustralianAddressExtractor implements AddressComponentExtractorInterface
{
public function supports(string $countryCode): bool
{
return $countryCode === 'AU';
}
public function getPriority(): int
{
return 75; // Between config-based and custom
}
public function extract(array $addressComponents): array
{
// Custom extraction logic for Australian addresses
$address = [];
foreach ($addressComponents as $component) {
if (in_array('street_number', $component['types'])) {
$address['street_number'] = $component['long_name'];
}
// ... more extraction logic
}
return $address;
}
}
// Register in service provider
$registry = app(AddressExtractorRegistry::class);
$registry->register(new AustralianAddressExtractor());Configuration Reference
All configuration options in config/addresses.php:
return [
// Google Maps API Keys — see CONFIGURATION-GUIDE.md for two-key security setup
'google_maps_api_key' => env('GOOGLE_MAPS_API_KEY'), // single-key fallback
'google_maps_server_key' => env('GOOGLE_MAPS_SERVER_KEY', env('GOOGLE_MAPS_API_KEY')),
'google_maps_browser_key' => env('GOOGLE_MAPS_BROWSER_KEY', env('GOOGLE_MAPS_API_KEY')),
// Verification settings
'verification' => [
'enabled' => env('ADDRESS_VERIFICATION_ENABLED', true),
'provider' => env('ADDRESS_VERIFICATION_PROVIDER', 'auto'),
'mode' => env('ADDRESS_VERIFICATION_MODE', 'interactive'), // interactive|silent
'provider_priority' => ['usps', 'smarty', 'google'], // config-only, no env var
'country_providers' => [
'US' => 'usps',
],
'fallback_to_geocoding' => true,
'cache_ttl' => env('ADDRESS_VERIFICATION_CACHE_TTL', 86400),
],
// Blur geocoding (auto-complete on tab/blur)
'blur_geocoding' => [
'enabled' => env('ADDRESS_BLUR_GEOCODING_ENABLED', true),
'min_length' => env('ADDRESS_BLUR_MIN_LENGTH', 10),
'skip_if_verified' => env('ADDRESS_BLUR_SKIP_IF_VERIFIED', true),
'debounce_ms' => env('ADDRESS_BLUR_DEBOUNCE_MS', 0),
'detect_paste' => env('ADDRESS_BLUR_DETECT_PASTE', true),
'require_completeness' => env('ADDRESS_BLUR_REQUIRE_COMPLETENESS', 'any'),
// Options: 'any', 'basic' (city OR postal), 'complete' (city AND state)
'smart_detection_level' => env('ADDRESS_BLUR_SMART_DETECTION', 'basic'),
// Options: 'basic', 'smart' (0.60 threshold), 'aggressive' (0.80 threshold)
],
// UI settings
'filament' => [
'enable_preview' => env('ADDRESS_FORM_PREVIEW', true),
'enable_map' => env('ADDRESS_FORM_MAP', true),
'input_mode' => env('ADDRESS_INPUT_MODE', 'auto'), // auto|autocomplete|geocoding|manual
'register_resource' => env('ADDRESS_RESOURCE_ENABLED', false),
],
// Component extraction for international addresses
'component_extraction' => [
'KR' => [
'address_line_1' => ['premise', 'sublocality_level_4', 'sublocality_level_3'],
'separator' => ' ',
],
'CN' => [
'address_line_1' => ['premise', 'sublocality_level_5', 'sublocality_level_4'],
],
],
];For more details, see:
- User Guide - Complete usage guide
- README - Installation and features
- Testing Guide - Test patterns and coverage
Built with ❤️ by Viewflex