alexgoncharcherkassy/mailchimpbundle
Installation:
composer require alexgoncharcherkassy/mailchimpbundle
Add the bundle to config/bundles.php (Symfony 4+) or AppKernel.php (Symfony 3):
AlexCk\MailchimpBundle\AlexCkMailchimpBundle::class => ['all' => true],
Configuration:
Define Mailchimp credentials in config/packages/alexck_mailchimp.yaml (Symfony 4+):
alexck_mailchimp:
username: '%env(MAILCHIMP_USERNAME)%'
api_key: '%env(MAILCHIMP_API_KEY)%'
version: '3.0'
Or configure dynamically in a service:
$mailchimp = $this->get('alexck_mailchimp.client');
$mailchimp->configure('username', 'api_key', '3.0');
First Use Case: Fetch all Mailchimp lists to verify connectivity:
$lists = $mailchimp->getLists();
dd($lists); // Debug the response
List Management:
$contact = (new ListItemContact())->setEmail('user@example.com');
$campaign = (new ListItemCampaignDefaults())->setFromName('Newsletter');
$listItem = (new ListItem())
->setName('My List')
->setContact($contact)
->setCampaignDefaults($campaign);
$createdList = $mailchimp->createList($listItem);
$members = [
(new Member())->setEmail('user1@example.com')->setMergeFields((new MemberMergeFields())->setFName('John')),
(new Member())->setEmail('user2@example.com')->setMergeFields((new MemberMergeFields())->setFName('Jane')),
];
$batchResp = $mailchimp->createBatchMember('list_id', $members);
Member Lifecycle:
$member = (new Member())
->setEmail('user@example.com')
->setStatus('subscribed')
->setMergeFields((new MemberMergeFields())->setFName('John'));
$mailchimp->createMember($member, 'list_id');
$mailchimp->createWebHookEventUnsubscribe('list_id', 'user@example.com');
$member = (new Member())->setEmail('user@example.com');
$mailchimp->deleteMember($member, 'list_id');
Event-Driven Integrations:
MemberUnsubscribed). Example:
// In a controller or command
$mailchimp->createWebHookEventUnsubscribe('list_id', 'user@example.com');
event(new MemberUnsubscribed($member));
# config/services.yaml
services:
App\Service\MailchimpClientInterface: '@alexck_mailchimp.client'
ListItem, Member, and MemberMergeFields DTOs across services (e.g., API responses → Mailchimp sync).GuzzleHttp\Exception\RequestException:
try {
$mailchimp->createMember($member, 'list_id');
} catch (\Exception $e) {
$this->logger->error('Mailchimp error: ' . $e->getMessage());
throw new \RuntimeException('Failed to sync with Mailchimp', 0, $e);
}
API Version Lock:
3.0. Ensure your Mailchimp account supports this version; otherwise, update the configure() call:
$mailchimp->configure('user', 'key', '2.0'); // Fallback to v2 if needed
Rate Limits:
createBatchMember) help mitigate this, but log throttled requests:
if ($batchResp->getStatusCode() === 429) {
$this->logger->warning('Mailchimp rate limit exceeded');
}
ID vs. Email:
Member::setId() for updates/deletes, but Mailchimp’s API often relies on email. Always verify the old_email parameter in updateMember():
// Wrong: May fail if 'id1' doesn’t match the email
$mailchimp->updateMember($member, 'list_id', 'wrong_email@example.com');
id:
$member = $mailchimp->getMember('user@example.com', 'list_id');
$member->setMergeFields((new MemberMergeFields())->setFName('Updated'));
$mailchimp->updateMember($member, 'list_id', 'user@example.com');
Webhook Delays:
Environment Variables:
Use .env for credentials:
MAILCHIMP_USERNAME=your_username
MAILCHIMP_API_KEY=your_api_key-us12
Then reference them in alexck_mailchimp.yaml:
alexck_mailchimp:
username: '%env(MAILCHIMP_USERNAME)%'
api_key: '%env(MAILCHIMP_API_KEY)%'
Testing:
$this->mockBuilder()
->getContainer()
->andReturn($this->createMock(MailchimpClient::class));
Extension Points:
$mailchimp->get('campaigns', [], 'campaigns');
$mailchimp->setResponseTransformer(function ($response) {
return json_decode($response->getBody(), true);
});
Logging: Enable Guzzle logging to debug API calls:
$mailchimp->setClient(new \GuzzleHttp\Client([
'handler' => \GuzzleHttp\HandlerStack::create(new \GuzzleHttp\Middleware::tap(function ($request) {
$this->logger->debug('Mailchimp Request:', ['url' => (string) $request->getUri()]);
}))
]));
Data Validation:
Validate DTOs before sending to Mailchimp (e.g., ensure email is present in Member):
if (empty($member->getEmail())) {
throw new \InvalidArgumentException('Member email is required');
}
How can I help you explore Laravel packages today?