Installation
composer require baks-dev/avito-promotion
Ensure your project meets the PHP 8.4+ requirement and has baks-dev/core (≥7.4) installed.
Service Provider & Facade
Register the package in config/app.php under providers:
BaksDev\AvitoPromotion\AvitoPromotionServiceProvider::class,
Publish the config (if needed):
php artisan vendor:publish --provider="BaksDev\AvitoPromotion\AvitoPromotionServiceProvider" --tag="config"
Update your .env with Avito API credentials (see config/avito-promotion.php).
First Use Case: Fetching Promotions Use the facade to retrieve promotions for an ad:
use BaksDev\AvitoPromotion\Facades\AvitoPromotion;
$promotions = AvitoPromotion::getPromotionsForAd($adId);
Verify the response structure in src/Response/PromotionResponse.php.
Promotion Management
$promotion = AvitoPromotion::createPromotion([
'ad_id' => $adId,
'start_date' => now()->addDays(7),
'end_date' => now()->addDays(14),
'budget' => 1000.00,
]);
AvitoPromotion::pausePromotion($promotionId);
AvitoPromotion::resumePromotion($promotionId);
Event-Driven Integration
Listen for Avito webhook events (e.g., promotion.status_changed):
// In EventServiceProvider
protected $listen = [
'BaksDev\AvitoPromotion\Events\PromotionStatusChanged' => [
\App\Listeners\UpdateAdStatus::class,
],
];
Bulk Operations
Use the BulkPromotionManager for batch updates:
$manager = app(\BaksDev\AvitoPromotion\Managers\BulkPromotionManager::class);
$manager->updatePromotions($promotionIds, ['budget' => 1500.00]);
dispatch(new \BaksDev\AvitoPromotion\Jobs\ProcessPromotion($promotionData));
$promotions = Cache::remember("avito_promotions_{$adId}", now()->addHours(1), function() use ($adId) {
return AvitoPromotion::getPromotionsForAd($adId);
});
// app/Http/Middleware/HandleAvitoRateLimit.php
public function handle($request, Closure $next) {
if (AvitoPromotion::isRateLimited()) {
return response()->json(['error' => 'Rate limit exceeded'], 429);
}
return $next($request);
}
API Credentials
.env and validate credentials on first run:
if (!config('avito-promotion.client_id') || !config('avito-promotion.client_secret')) {
throw new \RuntimeException('Avito API credentials not configured.');
}
Timezone Mismatches
$startDate = now()->setTimezone('UTC')->toDateTimeString();
Idempotency
idempotency_key in requests:
$promotion->setIdempotencyKey(strtolower(md5(uniqid())));
Enable Logging
Configure the log_channel in config/avito-promotion.php to single or stack for detailed logs:
'log_channel' => 'avito',
Add a channel in config/logging.php:
'avito' => [
'driver' => 'single',
'path' => storage_path('logs/avito.log'),
'level' => 'debug',
],
Mocking Avito API
Use the AvitoPromotionMock for testing:
$mock = new \BaksDev\AvitoPromotion\Testing\AvitoPromotionMock();
$mock->shouldReceive('getPromotionsForAd')->andReturn([...]);
Custom Promotion Rules
Extend the PromotionRule interface to add business logic:
class CustomBudgetRule implements \BaksDev\AvitoPromotion\Contracts\PromotionRule {
public function validate(array $promotionData): bool {
return $promotionData['budget'] >= 500.00;
}
}
Register in config/avito-promotion.php:
'rules' => [
\App\Rules\CustomBudgetRule::class,
],
Webhook Handlers
Override default event handlers by binding your listeners to the PromotionStatusChanged event.
Response Transformers
Customize API responses by extending PromotionResponse:
class CustomPromotionResponse extends \BaksDev\AvitoPromotion\Response\PromotionResponse {
public function toArray(): array {
$array = parent::toArray();
$array['formatted_budget'] = number_format($array['budget'], 2);
return $array;
}
}
Bind the transformer in the service provider:
$this->app->bind(
\BaksDev\AvitoPromotion\Contracts\PromotionResponse::class,
\App\Response\CustomPromotionResponse::class
);
How can I help you explore Laravel packages today?