esitchikhin/laravel-dadata
Laravel SDK для DaData.ru (форк movemoveapp/laravel-dadata) с исправлением получения организации по ИНН. Поддерживает PHP 7.3–8.1 и Laravel 7–9. Настройка через .env (DADATA_TOKEN/SECRET/TIMEOUT), публикация конфига через artisan.
Installation:
composer require esitchikhin/laravel-dadata
Publish the config file:
php artisan vendor:publish --provider="Esitchikhin\LaravelDaData\DaDataServiceProvider" --tag="config"
Configure .env:
Add your DaData API token:
DADATA_TOKEN=your_api_token_here
First Use Case: Validate and correct a phone number:
use Esitchikhin\LaravelDaData\Facades\DaData;
$phone = DaData::phone()->clean('+7(911)123-45-67');
// Returns: "+79111234567"
DaData::phone() – Phone number validation/correction.DaData::address() – Address parsing/suggestions.DaData::suggest() – Autocomplete for addresses, companies, or FIO.DaData::company() – Company details by INN or name.DaData::name() – Name parsing (e.g., extract surname, first name).// Suggest addresses while typing
$suggestions = DaData::suggest()->address('ул. Невский, 12', 5); // Top 5 matches
// Clean and validate submitted address
$cleanedAddress = DaData::address()->clean($request->address);
// Clean raw input
$cleanPhone = DaData::phone()->clean($request->phone);
// Validate format
if (!DaData::phone()->isValid($cleanPhone)) {
return back()->withErrors(['phone' => 'Invalid phone number']);
}
$company = DaData::company()->byInn('1234567890'); // Returns full company data
// OR
$company = DaData::company()->byName('ООО Рога и Копыта');
$parsedName = DaData::name()->parse('Иванов Иван Иванович');
// Returns:
// [
// 'surname' => 'Иванов',
// 'first_name' => 'Иван',
// 'patronymic' => 'Иванович',
// ]
use Esitchikhin\LaravelDaData\Rules\Phone;
$request->validate([
'phone' => ['required', new Phone],
'address' => ['required', 'dadata_address'], // Custom rule
]);
use Esitchikhin\LaravelDaData\Rules\DaDataRule;
class AddressRule extends DaDataRule {
protected $type = 'address';
}
Rate Limiting: Cache responses aggressively (e.g., 5-minute TTL for suggestions) to avoid hitting DaData’s rate limits.
$suggestions = Cache::remember("dadata_suggestions_{$query}", now()->addMinutes(5), function () use ($query) {
return DaData::suggest()->address($query, 5);
});
Error Handling: Wrap DaData calls in try-catch blocks to handle API errors gracefully:
try {
$result = DaData::phone()->clean($phone);
} catch (\Esitchikhin\LaravelDaData\Exceptions\DaDataException $e) {
Log::error("DaData API error: " . $e->getMessage());
return back()->withErrors(['phone' => 'Service unavailable']);
}
Testing: Use the package’s mocking capabilities in tests:
DaData::shouldReceive('phone()->clean')->andReturn('+79111234567');
Token Management:
.env token is not encrypted by default. Use Laravel’s env() helper or a secure secrets manager in production.Rate Limits:
INN/Company Lookup:
byInn() method requires a valid 10-digit INN (e.g., 7707085378). Invalid INNs return null.77 (Moscow), 78 (St. Petersburg), etc. Validate the prefix if needed.Phone Number Formats:
+79111234567). Local formats (e.g., 8(911)123-45-67) must be cleaned first.DaData::phone()->clean() before validation.Address Parsing:
ул. Невский in Moscow (77) differs from St. Petersburg (78).$suggestions = DaData::suggest()->address('Невский', 5, ['region' => '77']);
Deprecated Methods:
company()->byInn(). This fork fixes it, but always check the changelog for breaking changes.Enable Debug Mode:
Set DADATA_DEBUG=true in .env to log raw API responses to storage/logs/dadata.log.
Validate API Responses:
Use dd() to inspect responses:
$response = DaData::suggest()->address('test');
dd($response->data); // Check structure
Common HTTP Errors:
.env.Custom DaData Clients: Override the default HTTP client for advanced use cases (e.g., retries, middleware):
// In config/dadata.php
'client' => [
'handler' => \Http\Adapter\Guzzle\Client::class,
'options' => [
'timeout' => 10,
'headers' => [
'User-Agent' => 'MyApp/1.0',
],
],
],
Add New DaData Services:
The package follows a modular pattern. To add a new service (e.g., DaData::bank()):
DaDataService class.DaDataServiceProvider.Local Testing: Use DaData’s sandbox for testing without real API calls. Mock responses in tests:
DaData::shouldReceive('address()->clean')->andReturn(['postal_code' => '123456']);
Batch Processing: For bulk operations (e.g., cleaning 1000+ phone numbers), use DaData’s batch API and implement chunking:
foreach (array_chunk($phones, 100) as $chunk) {
$cleaned = DaData::phone()->cleanBatch($chunk);
}
How can I help you explore Laravel packages today?