Installation
composer require dywee/newsletter-bundle
Register the bundle in config/bundles.php:
return [
// ...
Dywee\NewsletterBundle\DyweeNewsletterBundle::class => ['all' => true],
];
Routing
Add to config/routes.yaml:
dywee_newsletter:
resource: "@DyweeNewsletterBundle/Resources/config/routing.yml"
prefix: /newsletter
First Use Case
/newsletter/subscriber to view/list subscribers.DyweeCoreBundle is installed) to create campaigns via /newsletter/campaign.Subscriber Management
Dywee\NewsletterBundle\Controller\SubscriberController for custom logic.SubscriberType form (if available) in your templates:
{{ form_start(form) }}
{{ form_widget(form.email) }}
{{ form_widget(form.consent) }}
{{ form_end(form) }}
Campaign Creation
DyweeCoreBundle is installed, use its CRUD generator for Campaign entity.Campaign entity with fields like title, content, sent_at, and status.Dywee\NewsletterBundle\Service\CampaignSender to customize email dispatch:
$sender = $this->container->get('dywee_newsletter.campaign_sender');
$sender->send($campaign, $subscribers);
Templates and Emails
templates/newsletter/emails/. Example:
{# templates/newsletter/emails/welcome.html.twig #}
<h1>Welcome, {{ subscriber.email }}!</h1>
CampaignSender:
$sender->setTemplateVars(['subscriber' => $subscriber]);
Event-Driven Extensions
newsletter.subscriber.created or newsletter.campaign.sent:
// src/EventListener/NewsletterListener.php
public function onSubscriberCreated(SubscriberEvent $event) {
// Custom logic (e.g., log, notify)
}
# config/services.yaml
Dywee\NewsletterBundle\EventListener\NewsletterListener:
tags:
- { name: kernel.event_listener, event: newsletter.subscriber.created, method: onSubscriberCreated }
Missing DyweeCoreBundle
DyweeCoreBundle for admin features. Without it:
Subscriber/Campaign entities.make:crud or make:entity to scaffold controllers/forms.Routing Conflicts
config/routes.yaml to avoid clashes with other bundles:
dywee_newsletter:
prefix: /admin/newsletter # Avoid root conflicts
Email Template Paths
templates/newsletter/emails/ or configure a custom path via dependency injection:
$templating->setPath('custom/newsletter/templates');
Database Migrations
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Subscriber Not Saved?
Subscriber entity is properly mapped in SubscriberController:
$subscriber = new Subscriber();
$subscriber->setEmail($request->request->get('email'));
$em->persist($subscriber);
$em->flush(); // Ensure flush() is called
Emails Not Sending?
CampaignSender service is bound and the Swiftmailer bundle is configured:
# config/packages/swiftmailer.yaml
swiftmailer:
transport: %env(MAILER_DSN)%
Admin Panel Missing
DyweeCoreBundle is missing, manually create routes for Subscriber/Campaign:
app_subscriber:
resource: '@AppController/SubscriberController'
type: annotation
Custom Subscriber Fields
Subscriber entity:
// src/Entity/ExtendedSubscriber.php
#[ORM\Entity]
class ExtendedSubscriber extends Subscriber {
#[ORM\Column]
private ?string $customField = null;
}
SubscriberType) to include new fields.Bulk Actions
BulkSubscriberController to handle exports/imports:
public function export(SubscriberRepository $repo): Response {
$subscribers = $repo->findAll();
$csv = $this->csvExporter->export($subscribers);
return new Response($csv, 200, ['Content-Type' => 'text/csv']);
}
Webhook Integration
public function onMailchimpSync(MailchimpEvent $event) {
$this->entityManager->flush();
}
How can I help you explore Laravel packages today?