Installation:
composer require andi/kickbox-bundle
Add the bundle to config/bundles.php (Symfony 4+) or app/AppKernel.php (Symfony 2/3):
Andi\KickBoxBundle\AndiKickBoxBundle::class => ['all' => true],
Configuration:
Add your Kickbox API key(s) to config/packages/andi_kick_box.yaml:
andi_kick_box:
api_keys:
default:
key: "%env(KICKBOX_API_KEY)%"
default_api_name: default
First Use Case: Verify an email in a controller:
use Andi\KickBoxBundle\Client\KickboxClient;
public function verifyEmail(Request $request, KickboxClient $kickbox)
{
$email = $request->get('email');
$response = $kickbox->verify($email);
return new JsonResponse($response->getResult());
}
Email Validation Middleware:
// app/Http/Middleware/ValidateEmail.php
public function handle($request, Closure $next)
{
if ($request->is('register') && !$request->hasValidatedEmail()) {
$kickbox = app(KickboxClient::class);
$response = $kickbox->verify($request->email);
if (!$response->isSuccess() || $response->getResult() === 'undeliverable') {
throw new \Exception('Invalid email address');
}
}
return $next($request);
}
Batch Processing:
public function bulkVerify(array $emails)
{
$results = [];
foreach ($emails as $email) {
$results[$email] = app(KickboxClient::class)->verify($email)->getResult();
}
return $results;
}
Service Integration:
public function register(UserRequest $request)
{
$response = app(KickboxClient::class)->verify($request->email);
if ($response->getResult() === 'deliverable') {
$user = User::create($request->validated());
return response()->json(['success' => true]);
}
return response()->json(['error' => 'Email invalid'], 400);
}
public function cleanMailingList()
{
$emails = MailingList::all()->pluck('email');
$invalid = collect($emails)->filter(function($email) {
return app(KickboxClient::class)->verify($email)->getResult() !== 'deliverable';
});
MailingList::whereIn('email', $invalid)->delete();
}
Caching Responses:
public function verifyWithCache($email, $ttl = 86400)
{
$cacheKey = "kickbox_{$email}";
if (cache()->has($cacheKey)) {
return cache()->get($cacheKey);
}
$response = app(KickboxClient::class)->verify($email);
cache()->put($cacheKey, $response, $ttl);
return $response;
}
API Key Management:
config/ violates security best practices. Use environment variables (%env(KICKBOX_API_KEY)%) or Laravel's .env.Rate Limiting:
429 Too Many Requests.use Illuminate\Support\Facades\Queue;
Queue::later(now()->addSeconds(10), function() use ($email) {
app(KickboxClient::class)->verify($email);
});
Deprecated Bundle:
guzzlehttp/guzzle:^7.0).Response Handling:
isSuccess() method checks HTTP status, but business logic (e.g., deliverable vs. risky) requires manual checks:
if ($response->getResult() === 'undeliverable') {
// Block registration
} elseif ($response->getResult() === 'risky') {
// Flag for review
}
Timeouts:
$response = $kickbox->verify($email, 10000); // 10-second timeout
Enable Guzzle Debugging:
Add to config/services.php:
'guzzle' => [
'debug' => env('APP_DEBUG', false),
],
Check logs for raw API responses during failures.
Mocking for Tests:
Use Laravel’s MockHttp to simulate API responses:
$this->mock(KickboxClient::class)->shouldReceive('verify')
->once()
->andReturn((object) ['result' => 'deliverable']);
Common Errors:
KickBoxApiException: HTTP errors (e.g., 401 Unauthorized, 404 Not Found).
config/andi_kick_box.yaml.ConnectionException: Network issues.
Custom Response Handling:
Extend the Response class to add domain-specific logic:
namespace App\Services;
use Andi\KickBoxBundle\Response\KickboxResponse;
class EnhancedKickboxResponse extends KickboxResponse
{
public function isValidForNewsletter()
{
return $this->getResult() === 'deliverable' && !$this->isDisposable();
}
}
Bind it in AppServiceProvider:
$this->app->bind(KickboxResponse::class, function ($app) {
return new EnhancedKickboxResponse($app->make('kickbox_client')->verify('test@example.com'));
});
Queue Failed Requests: Retry failed verifications using Laravel Queues:
public function verifyWithRetry($email, int $retries = 3)
{
try {
return app(KickboxClient::class)->verify($email);
} catch (\Exception $e) {
if ($retries > 0) {
Queue::push(new VerifyEmailJob($email, $retries - 1));
}
throw $e;
}
}
Webhook Integration: Use Kickbox’s webhooks to sync real-time updates:
Route::post('/kickbox-webhook', function (Request $request) {
$payload = $request->json()->all();
// Update local records based on $payload['result']
});
How can I help you explore Laravel packages today?