composer require icekristal/laravel-dadata
php artisan vendor:publish --provider="Icekristal\DaData\DaDataServiceProvider"
.env:
DADATA_TOKEN="your_token_here"
DADATA_SECRET="your_secret_here"
DADATA_TIMEOUT=10
use Icekristal\DaData\Facades\DaDataAddress;
// Standardize an address
$standardizedAddress = DaDataAddress::standardization('мск сухонска 11/-89');
dd($standardizedAddress);
DaDataAddress: For address-related operations (standardization, suggestions, geocoding).DaDataName: For name parsing and suggestions (e.g., FIO).DaDataEmail: For email validation and suggestions.DaDataPhone: For phone number validation.DaDataCompany: For company lookup (e.g., by INN).DaDataBank: For bank identification (e.g., by BIC/SWIFT).DaDataPassport: For passport validation (e.g., MVD registry checks).Use Case: Enhance user input fields (e.g., address, name, email) with real-time suggestions and validation.
Workflow:
input events (e.g., using Laravel Mix/Vue/React).DaDataAddress::suggestions() or DaDataName::suggestions() to fetch hints.Example: Address Suggestions
use Icekristal\DaData\Facades\DaDataAddress;
// Fetch suggestions for an address query
$suggestions = DaDataAddress::suggestions('мск сухонска');
return response()->json($suggestions);
Integration Tip:
Cache::remember) for high-frequency queries like autocomplete.FormRequest to validate inputs against DaData responses.Use Case: Normalize user-submitted data (e.g., addresses, emails) before storage.
Workflow:
$cleanAddress = DaDataAddress::standardization($rawAddress)->first();
$user->address = $cleanAddress['result'];
$validEmail = DaDataEmail::check($rawEmail)->isValid();
$parsedName = DaDataName::parse($rawName);
$user->first_name = $parsedName['first_name'];
Integration Tip:
Observers or Model Events to auto-clean data on creating/updating.User model:
public function saving(User $user)
{
if ($user->isDirty('address')) {
$cleanAddress = DaDataAddress::standardization($user->address)->first();
$user->address = $cleanAddress['result'];
}
}
Use Case: Convert addresses to coordinates for Google Maps or custom maps.
Workflow:
$addressData = DaDataAddress::standardization('мск сухонска 11/-89')->first();
$lat = $addressData['geo_lat'];
$lon = $addressData['geo_lon'];
// Store in database or pass to frontend
Integration Tip:
geo_lat/geo_lon in a morphTo relationship for polymorphic geocoding.Use Case: Clean existing data in bulk (e.g., migrate old addresses).
Workflow:
use Icekristal\DaData\Facades\DaDataAddress;
$users = User::whereNull('clean_address')->chunk(50, function ($users) {
foreach ($users as $user) {
$cleanAddress = DaDataAddress::standardization($user->address)->first();
$user->update(['clean_address' => $cleanAddress['result']]);
}
});
Integration Tip:
dispatch()) for long-running batches.try-catch and retry logic.Use Case: Abstract DaData calls behind a service layer for easier testing/mocking.
Example Service:
class DaDataService {
public function standardizeAddress(string $address): array
{
return DaDataAddress::standardization($address)->first();
}
public function getAddressSuggestions(string $query): array
{
return DaDataAddress::suggestions($query);
}
}
Integration Tip:
bindings to resolve the service in controllers:
public function __construct(private DaDataService $daData) {}
throttle middleware or cache responses aggressively.Cache::remember("dadata_{$query}", now()->addHours(1), function() use ($query) {
return DaDataAddress::suggestions($query);
});
429 (Too Many Requests) or 401 (Invalid Token).
try-catch and retry with exponential backoff.try {
$result = DaDataAddress::standardization($address);
} catch (\GuzzleHttp\Exception\RequestException $e) {
if ($e->getCode() === 429) {
sleep(2); // Retry after delay
return $this->standardizeAddress($address);
}
throw $e;
}
DADATA_TIMEOUT (default: 10s).
.env for complex queries:
DADATA_TIMEOUT=30
qc (quality control) flags (e.g., qc_house: 2 means "house number is uncertain").
$address = DaDataAddress::standardization($rawAddress)->first();
if ($address['qc_house'] > 0) {
// Handle uncertainty (e.g., prompt user for verification)
}
MockFacade:
DaDataAddress::shouldReceive('standardization')
->once()
->andReturn([['result' => 'Test Address']]);
DADATA_TOKEN and DADATA_SECRET in .env.
DADATA_SECRET to the same value as DADATA_TOKEN.Custom Responses: Extend the package by publishing and modifying the config:
php artisan vendor:publish --provider="Icekristal\DaData\DaDataServiceProvider" --tag=config
config/dadata.php.New Endpoints: Use the underlying Guzzle client to call unsupported DaData APIs:
$client = app('dadata.client');
$response = $client->request('POST', '/api/v1/cleanse/phone', [
'json' => ['phone' => '+79123456789']
]);
parallel helper or queues to batch requests:
$emails = User::pluck('email');
$results =
How can I help you explore Laravel packages today?