- Is 2lenet/hermes-bundle a Laravel package?
- No. HermesBundle is a Symfony bundle built for CruditBundle, and it ships no Laravel service provider, facade, or publishable config. Its admin dashboard, Doctrine entities, Twig rendering, and DI extension are all Symfony-specific glue. For a Laravel codebase this is a fork-and-rewrite port, not a Composer integration.
- How do I install 2lenet/hermes-bundle?
- Run composer require 2lenet/hermes-bundle and then follow the docs to register the bundle and configure it. On Symfony projects with Flex the recipe handles registration and initial config. Afterwards you apply the shipped Doctrine migrations, set a real Mailer DSN instead of null://, and author your base Twig/MJML templates.
- Which Laravel and Symfony versions does HermesBundle support?
- There is no Laravel support at all, so no Laravel version constraint exists. The package targets Symfony applications, with compatibility for Symfony 6.4, 7.x, and 8.x, and Symfony 8 support landed in version 1.9.0. It also expects Doctrine ORM, Twig, and CruditBundle to be present in the host application.
- What does HermesBundle actually do?
- It is a mail management layer that stores Mail and Recipient entities, renders bodies from Twig and MJML templates, handles attachments and CC sublists, and exposes a CruditBundle admin dashboard. You get cancel-send, resend-per-recipient, status filtering, and consent or link-click statistics per template. Actual delivery is delegated to Symfony Mailer, so the durable value is the template and recipient state model rather than the send mechanism.
- Can I use HermesBundle with Eloquent instead of Doctrine?
- Not without a port. The package is built on Doctrine ORM entities and mappings, while Laravel defaults to Eloquent, so you would either stand up Doctrine alongside Eloquent or rewrite the entities and repositories. The schema also lands in your database via shipped migrations, so review the Recipient PII fields and indexing before applying them.
- Does HermesBundle work without CruditBundle?
- It has a hard dependency on CruditBundle, which provides the dashboard, filters, and actions. Without Crudit you inherit unused admin code and transitive dependencies for no benefit. If you want the data model only, fork the bundle and trim the Crudit wiring out.
- How does HermesBundle send email and which transports can I use?
- Delivery goes through Symfony Mailer, so any Mailer transport works, including SES, Postmark, and standard SMTP. You configure this via the Mailer DSN, and you should not ship with the null:// transport enabled. Because Laravel's mailer also sits on symfony/mailer, transports are shared even though the surrounding bundle code is not portable.
- How do I add an unsubscribe or consent link in a HermesBundle template?
- Add an anchor in the template whose href is the CONSENT_LINK placeholder, for example an anchor with href set to CONSENT_LINK, and enable the statistics boolean on the Template. That flag also turns on link-click statistics. The template context additionally exposes consent_value as a boolean so you can branch on whether the recipient has already consented. Verify signed-link behaviour, since a fix for it shipped in 1.8.6.
- What are the best Laravel alternatives to HermesBundle?
- For Laravel, use Mailables plus a small admin resource such as a Filament or Nova panel to manage templates and recipients, and delegate unsubscribe and click tracking to your ESP. If you need A/B testing, journeys, or campaign analytics, use a dedicated provider like SES, Postmark, or Mailchimp rather than building it. HermesBundle itself is only worth adopting if you already run Symfony with CruditBundle, Twig, and Doctrine.
- Is HermesBundle maintained and safe for production?
- It is MIT licensed with no vendor lock-in and is current with Symfony 8 as of 1.9.0, but it is a small agency-backed project with roughly two stars, zero dependents, and a bus factor of one or two. Treat it as something you may need to own: pin a version such as 1.11.x and be prepared to fork if releases stop. Also confirm how sends are batched and queued, since Symfony Messenger integration and mid-batch failure behaviour are not clearly documented.