baks-dev/avito-board
Laravel/PHP модуль baks-dev/avito-board для интеграции с Avito: публикация и управление объявлениями, поддержка PHP 8.4+. Устанавливается через Composer, есть PHPUnit-тесты (группа avito-board). Лицензия MIT.
Installation:
composer require baks-dev/avito-board baks-dev/core:^7.4
Verify php -v is 8.4+ and Laravel is 10.x (Symfony 6+ compatible).
Publish Configuration:
php artisan vendor:publish --provider="BaksDev\AvitoBoard\AvitoBoardServiceProvider" --tag="config"
Edit config/avito-board.php to set:
api_key (Avito API credentials).default_category (e.g., "notebooks").cache_driver (e.g., "redis" for performance).First Integration: Use the Facade to fetch ads in a controller:
use BaksDev\AvitoBoard\Facades\AvitoBoard;
public function index()
{
$ads = AvitoBoard::searchAds(['category' => 'notebooks', 'limit' => 10]);
return view('ads.index', compact('ads'));
}
Note: The facade abstracts Symfony’s AvitoBoardClient; ensure AvitoBoardServiceProvider is registered in config/app.php.
Blade Template:
Display ads in resources/views/ads/index.blade.php:
@foreach($ads as $ad)
<div class="ad-card">
<h3>{{ $ad->title }}</h3>
<p>{{ $ad->price }} ₽</p>
<a href="{{ $ad->url }}">View on Avito</a>
</div>
@endforeach
Route:
Add to routes/web.php:
use App\Http\Controllers\AdController;
Route::get('/ads', [AdController::class, 'index']);
$adData = [
'title' => 'MacBook Pro 2023',
'price' => 120000,
'category' => 'notebooks',
'description' => 'Like new...',
];
AvitoBoard::createAd($adData); // Returns Avito ad ID
use Illuminate\Support\Facades\Queue;
Queue::push(function () {
AvitoBoard::syncAd($adId, $updatedData);
});
$results = AvitoBoard::searchAds([
'category' => 'phones',
'price_min' => 5000,
'price_max' => 20000,
'region' => 'moscow',
]);
$paginatedAds = AvitoBoard::searchAds([...], ['page' => 2, 'per_page' => 20]);
$authUrl = AvitoBoard::getAuthUrl(['scope' => 'ads.write']);
// Redirect user to $authUrl, then handle callback with:
$token = AvitoBoard::handleAuthCallback($code);
use BaksDev\AvitoBoard\Events\AdUpdated;
event(new AdUpdated($adId, $changes));
// In EventServiceProvider
protected $listen = [
AdUpdated::class => [
\App\Listeners\SyncLocalAd::class,
],
];
Service Binding:
Bind Symfony services to Laravel’s container in AppServiceProvider:
public function register()
{
$this->app->singleton(\BaksDev\AvitoBoard\Client\AvitoClient::class, function ($app) {
return new \BaksDev\AvitoBoard\Client\AvitoClient(
$app['config']['avito-board.api_key']
);
});
}
Facade Alias:
Add to config/app.php:
'aliases' => [
// ...
'AvitoBoard' => \BaksDev\AvitoBoard\Facades\AvitoBoard::class,
],
$ads = Cache::remember("avito_ads_{$category}", now()->addHours(1), function () use ($category) {
return AvitoBoard::searchAds(['category' => $category]);
});
Queue::later(now()->addMinutes(5), function () use ($adId) {
AvitoBoard::syncAd($adId);
});
$response = Http::fake([
'api.avito.ru/*' => Http::response([...], 200),
]);
$ads = AvitoBoard::searchAds([...]);
$response->assertSent();
Symfony Dependency Hell:
baks-dev/core may pull in Symfony components (e.g., symfony/console) that conflict with Laravel.composer why-not to detect conflicts. Isolate in a separate service if needed.Undocumented API Limits:
429 errors.use Illuminate\Support\Facades\Http;
Http::timeout(30)->retry(3, 100)->get(...);
Twig in Blade:
tightenco/ziggy for URL helpers.Missing Laravel Events:
AdCreatedEvent) won’t trigger Laravel listeners.AvitoBoard::onAdCreated(function ($ad) {
event(new \App\Events\AdCreated($ad));
});
Database Schema Mismatch:
Enable Avito API Logging:
'logging' => [
'enabled' => true,
'path' => storage_path('logs/avito.log'),
],
in config/avito-board.php.
Symfony Debug Dump:
Use dd() or dump() from symfony/var-dumper:
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
$cloner = new VarCloner();
$dumper = new CliDumper();
$dumper->dump($cloner->clone($avitoResponse));
Common Errors:
ClassNotFoundException: Missing baks-dev/core or Symfony components.
Fix: Run composer dump-autoload.InvalidArgumentException: Invalid Avito API parameters.
Fix: Validate inputs with Laravel’s Validator.Custom Ad Fields:
Extend the Ad model by adding traits:
use BaksDev\AvitoBoard\Models\Ad as BaseAd;
class Ad extends BaseAd
{
protected $casts = [
'custom_field' => 'array',
];
}
Webhook Handlers: Create a Laravel command to process Avito webhooks:
use Illuminate\Console\Command;
use BaksDev\AvitoBoard\Events\WebhookReceived;
class ProcessAvitoWebhooks extends Command
{
public function handle()
{
event(new WebhookReceived($payload));
}
}
Localization: Override Russian-specific text:
AvitoBoard::setTranslator(function ($key, $params) {
return __("avito.{$key}", $params);
});
Testing Hooks: Stub Avito API responses in tests:
AvitoBoard::shouldReceive('
How can I help you explore Laravel packages today?