grossum/contact-bundle
A Symfony bundle from Grossum that bundles contact form and contact request handling into a reusable package. It gives you ready-made entities, form types, and controller logic for capturing enquiries, storing submissions, and notifying recipients, so you can wire a working contact flow into a Symfo...
v0.1 is the first public release, so treat it as a pre-stable API: pin it exactly ("vendor/package": "0.1.*") and expect breaking changes before 1.0.
Install and inspect the package manifest first.
composer require vendor/package:0.1.*
Before writing any code, open the package's composer.json to confirm:
extra.laravel.providers (auto-discovered in Laravel 5.5+, so no manual registration should be needed),extra.laravel.aliases,illuminate/* constraints — a mismatch here is the most common reason a fresh v0.1 install silently does nothing.Publish and read the config, even if you think you don't need to.
php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider"
The published file is the best documentation a 0.1 release has. Defaults tell you which features are opt-in vs. on-by-default, and the config/ file is usually the only stable contract at this stage.
Check migrations and routes before your first request.
php artisan migrate --pretend # inspect before running
php artisan route:list | grep -i <package-prefix>
A first public release may ship migrations that run automatically or only when published — verify which, so you don't get surprised in CI.
First use case: the README's happy path in a scratch route or tinker session.
Get one end-to-end call working in php artisan tinker (or a throwaway route) against a local database before wiring it into application code. At v0.1 the highest-value thing you can establish is a minimal reproducible "it works" baseline you can return to when the next release breaks something.
App\Support\<Thing>\<Thing>Interface → VendorPackageAdapter) costs an hour now and saves a refactor when 0.2 renames methods. Bind it in a PackageServiceProvider of your own.config('features.<package>')) so you can disable it in production without a deploy if v0.1 misbehaves:
// config/features.php
'billing_sync' => env('FEATURE_BILLING_SYNC', false),
tests/TestCase::setUp() and never hit the real backend in unit tests. If it doesn't ship one, mock your interface, not the package class — mocking vendor internals is brittle across patch releases.config/<package>.php referencing env(), and never call env() outside config files — it returns null once php artisan config:cache has run.config:cache hides new config keys. After upgrading, always php artisan config:clear (and in deploys, config:cache as a fresh build step). A missing key usually manifests as a confusing "undefined index" or a silently disabled feature rather than a clear error.bootstrap/cache/packages.php and run php artisan package:discover. This bites most often in Docker images built before composer install completed.vendor:publish --tag=<package>-config may not exist yet in a 0.1; fall back to --provider= and inspect what actually landed with git status.migrate --pretend first and check the down() method exists before you run it anywhere that matters. If down() is empty, take a database snapshot before the first migrate on shared environments.extra.laravel.aliases for names that clash with existing facades; a duplicate alias resolves to whichever provider registers last and produces genuinely confusing bugs.SerializesModels). If not, keep them out of job payloads — pass IDs and re-resolve inside the job.$tries/$backoff on any job wrapping the package rather than trusting library defaults.try/catch, log get_class($e) plus config('app.debug') ? $e->getTraceAsString() : null, and re-throw. Vendor exceptions in early releases are frequently unhelpful (InvalidArgumentException with no context), and having the wrapper in place from day one makes triage far faster.How can I help you explore Laravel packages today?