rich-id/email-customization-bundle
A Symfony bundle for customizing outgoing emails, with configurable templates, layouts, and styling so applications can brand and tailor transactional messages without duplicating markup across mailers.
This release is a platform-compatibility bump: PHP 8.0+ and Symfony 5.4 (the last LTS of the 5.x line). That tells you most of what you need before writing a line of code:
composer why symfony/console — if you're pinned to symfony/*:^6.0, this release won't install alongside your app without an alias or a conflict workaround.composer require <vendor>/<package>:^0.2 then read the package's composer.json (require, extra.laravel.providers, extra.laravel.aliases) and its src/ tree. At 0.x, the public API is the classes actually referenced in the README — everything else is internal and may move.extra.laravel, you only need php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider" for config/migrations. Verify with php artisan about or php artisan config:show <package> that your published file is actually the one being read.sync/array defaults.Before investing further, run the package's own test suite against your PHP version (vendor/bin/phpunit or pest) — a 0.2.0 release whose only changelog entry is a platform bump often means "compiles and installs," not "feature-complete."
Treat the service container as the integration seam. Resolve the package's entry point from the container rather than instantiating it, so you can swap it in tests and decorate it without forking:
// In a service provider or your own thin wrapper
$this->app->bind(Contract::class, fn ($app) => $app->make(PackageManager::class));
Wrap, don't scatter. Put a single adapter class in app/Support/ that owns all calls into the package. When 0.3.0 renames something (likely, at this version), you change one file. This also gives you a place to normalise exceptions into your app's domain errors.
Feature-flag the rollout. Because you're on a 0.x dependency, gate the new behaviour behind a config key or Laravel Pennant feature so a rollback is a config change, not a deploy:
if (Feature::active('package-bridge')) { /* new path */ }
Console-first adoption. If the package bridges Symfony Console, the cheapest integration is a thin Artisan command that delegates. You get full Laravel scheduling, $this->output, and signal handling for free, and you avoid entangling web requests with a dependency that may churn.
Use PHP 8.0 idioms at the boundary only. Constructor promotion, named arguments, and the nullsafe operator are available now, but avoid them in any class that must remain mockable by older tooling (some mocking libraries and static analysers still stumble on promoted readonly-ish patterns). Keep the package's own types out of your public signatures.
Pin tightly in composer.json. "<vendor>/<package>": "0.2.*" — not ^0.2. Under semver-for-0.x, ^0.2 allows 0.2.x only, which is right, but be explicit so a composer update on another branch doesn't silently pull a 0.3 with breaking changes.
Queue and cache drivers matter. If the package performs IO, exercise it under Redis/database queue and a real cache store in staging before production. Symfony 5.4's contracts are more prescriptive about return types than 5.2's, and a driver that returns null where an interface says array will now throw rather than coerce.
Deprecated: Return type of ... should be compatible notices from vendored code. Silence them with error_reporting(E_ALL & ~E_DEPRECATED) in a local-only bootstrap, never in production.composer.lock resolved to 6.x, this package's ^5.4 constraint will either conflict outright or force a downgrade of unrelated packages. Run composer update --dry-run <vendor>/<package> first and read the resolution output carefully.git diff 0.1.0..0.2.0 -- src/ config/) before upgrading. "Compatibility release" frequently carries signature tightening — nullable parameters becoming non-nullable, void return types added, final keywords appearing — all of which are technically breaking under semver but invisible in the release notes.php artisan config:clear. In deployments, make sure config:cache runs after vendor:publish in your build pipeline, otherwise the published defaults never reach the compiled config.extra.laravel is not honoured and you must register the provider manually in config/app.php. Check composer why <vendor>/<package> if the provider seems "missing."config/app.php, or use $this->app->extend()), and (c) a published interface you can implement. Anything protected/private is not a seam — don't subclass into it.How can I help you explore Laravel packages today?