jiexaspb/laravel-dadata
Laravel SDK для работы с API DaData.ru: подсказки и стандартизация адресов и данных. Поддержка PHP 7.3–8.1, Laravel 7–9, настройка через .env (token/secret/timeout), публикация конфигурации и удобная интеграция через сервис-провайдер.
Installation:
composer require movemoveapp/laravel-dadata
For Laravel <5.5, manually register DaDataServiceProvider in config/app.php.
Publish Config:
php artisan vendor:publish --provider="MoveMoveIo\DaData\DaDataServiceProvider" --tag="config"
This generates config/dadata.php with default settings (API key, endpoint, etc.).
First Use Case: Validate and suggest corrections for a user's input (e.g., address or name):
use MoveMoveIo\DaData\Facades\DaData;
$result = DaData::suggest('address', '123 Main St, Moscow'); // Returns suggestions
$result = DaData::clean('address', '123 Main St, Moscow'); // Returns cleaned data
DaData::suggest($type, $query): Get autocomplete suggestions (e.g., for forms).DaData::clean($type, $query): Correct syntax errors in input (e.g., addresses, names).DaData::validate($type, $query): Validate input against DaData’s rules.// In a controller or service
public function getAddressSuggestions(Request $request) {
$query = $request->input('query');
$suggestions = DaData::suggest('address', $query);
return response()->json($suggestions);
}
axios) to call the endpoint and display suggestions in a dropdown.public function storeUserProfile(Request $request) {
$request->validate([...]);
$cleanedAddress = DaData::clean('address', $request->address);
$cleanedPhone = DaData::clean('phone', $request->phone);
User::create([
'name' => $request->name,
'address' => $cleanedAddress['result'],
'phone' => $cleanedPhone['result'],
]);
}
$users = User::all();
foreach ($users as $user) {
$cleanedData = DaData::clean('address', $user->address);
$user->update(['address' => $cleanedData['result']]);
}
chunk() for large datasets to avoid memory issues.// In config/dadata.php
'api_key' => env('DADATA_API_KEY'),
'endpoint' => 'https://cleaner.dadata.ru/api/v1/clean',
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
Or dynamically:
$result = DaData::setOptions(['endpoint' => 'custom-endpoint'])->clean('address', 'query');
Wrap DaData calls in a service class for reusability:
namespace App\Services;
use MoveMoveIo\DaData\Facades\DaData;
class DaDataService {
public function cleanAddress(string $address): string {
$cleaned = DaData::clean('address', $address);
return $cleaned['result'] ?? $address;
}
}
Validate and clean data in FormRequest classes:
public function rules() {
return [
'address' => 'required|string',
'phone' => 'nullable|string',
];
}
public function withValidator($validator) {
$validator->after(function ($validator) {
$validator->errors()->merge([
'address' => DaData::validate('address', $this->address) ? '' : 'Invalid address',
]);
});
}
DaData has rate limits. Cache responses to avoid hitting limits:
$cacheKey = "dadata_suggestions_{$query}";
$suggestions = Cache::remember($cacheKey, now()->addMinutes(5), function() use ($query) {
return DaData::suggest('address', $query);
});
API Key Management:
.env:
DADATA_API_KEY=your_api_key_here
Rate Limits:
429 Too Many Requests.Data Types:
address, phone, name). Using unsupported types (e.g., email) will fail silently or return unexpected results.Response Handling:
clean and validate methods return arrays with keys like result, qc, and meta. Always check for result:
$cleaned = DaData::clean('address', 'bad address');
if (empty($cleaned['result'])) {
// Handle error (e.g., log or notify user)
}
PHP Version Compatibility:
Enable Guzzle Logging:
Add this to config/dadata.php to debug API calls:
'debug' => env('APP_DEBUG', false),
Logs will appear in storage/logs/laravel.log.
Mocking for Tests: Use Laravel’s HTTP client to mock DaData responses:
$response = Http::fake([
'https://cleaner.dadata.ru/api/v1/clean' => Http::response(['result' => 'cleaned address']),
]);
$result = DaData::clean('address', 'test');
$response->assertSent(function ($request) {
return $request->toDadataApi();
});
Common Errors:
401 Unauthorized: Invalid API key. Double-check .env.400 Bad Request: Invalid query or type. Validate inputs.500 Server Error: DaData API issue. Check their status page.Custom Types: DaData supports custom types. Extend the package by adding a new facade method:
// In a service provider
DaData::extend('custom_type', function ($query) {
return DaData::callApi('custom_type', $query);
});
Webhook Integration: Use DaData’s webhook API to process data in real-time. Create a Laravel route:
Route::post('/dadata-webhook', [DaDataWebhookController::class, 'handle']);
Batch Processing:
For large datasets, use Laravel’s queue system to process records asynchronously:
foreach ($users as $user) {
CleanUserAddress::dispatch($user);
}
// CleanUserAddress.php
public function handle() {
$cleaned = DaData::clean('address', $this->user->address);
$this->user->update(['address' => $cleaned['result']]);
}
Local Testing: Use DaData’s sandbox for testing. Override the endpoint in config:
'endpoint' => 'https://cleaner.sandbox.dadata.ru/api/v1/clean',
How can I help you explore Laravel packages today?