dietercoopman/mailspfchecker
A Laravel package that validates a domain's SPF record: it checks whether a given IP address or host is authorized to send email, performs the required DNS lookups, and returns clear pass/fail results, helping you debug email deliverability and catch spoofing issues in your app.
composer require <vendor>/<package>:^1.0.7. Version 1.0.7 is the first release advertising Laravel 12 support, so pin at or above it if you are on Laravel 12 — earlier tags will fail dependency resolution against illuminate/*:^12.0.require block of the package's composer.json (to confirm the actual Illuminate constraint range and the minimum PHP version), the package service provider's register() and boot() methods (to see what is bound into the container and what is auto-discovered), and the published config file (to see which knobs you are expected to touch versus leave alone).bootstrap/providers.php (Laravel 11/12 style) or config/app.php for the provider, and run php artisan about to verify the package's service provider is actually loaded. A package that silently fails to register looks identical to a package with a broken API.php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider" --tag=config), set the one or two environment variables the config references, then resolve the package's primary service out of the container once — in a tinker session or a throwaway route — and exercise the single simplest operation the README documents. Do this before integrating it anywhere real; it separates "installed" from "working".config/ and read it via config(), never via env() outside a config file. This is the single most common way package integrations break under php artisan config:cache, which is standard in production deploys.setUp(); if it does not, bind a mock of its contract into the container in your test case.^1.0.7, run composer update <vendor>/<package> -W, then run the full suite plus a php artisan config:cache && php artisan route:cache cycle. Laravel 12 raises the PHP floor to 8.2 and moves Carbon to v3, so any package code or overriding application code that type-hints Carbon\Carbon return values or relies on pre-8.2 behaviour is the likeliest source of silent breakage.DB::transaction(). A package that dispatches on commit versus immediately is a behavioural difference you want to know about before production traffic finds it for you.composer.json may still cap illuminate/support at ^11.0, which will silently hold the package back at an older tag. Run composer why-not <vendor>/<package> 1.0.7 to find the blocker rather than guessing.php artisan config:clear && php artisan cache:clear and re-check. Conversely, always validate with caches on before shipping — that is the state production runs in.extra.laravel.providers, you must register it manually. Symptom: class-not-found on the facade, or config() returning null for the package's keys.php artisan tinker plus app()->make() on the service is faster than adding log lines. For container questions, app()->getBindings() and the Container's resolved-instance list tell you whether the package bound what you think it did. If the package swallows exceptions internally, check whether it exposes a log channel or a debug flag in its config before reaching for a debugger.extend() or rebind in your own provider, macros registered on its classes, events it dispatches, and any Handler/Driver/Resolver interface it publishes. Most day-to-day customisation should go through one of these rather than a subclass.1.0.x patch is a signal about the package's release discipline. The API surface is presumably unchanged, so treat this as a low-risk bump — but it also means the maintainers are treating compatibility as a patch, so pin with a caret and read the diff between your current tag and 1.0.7 if you are jumping more than one version.How can I help you explore Laravel packages today?