shalior/filament-persian-date-field
A Filament form field that adds a Persian (Jalali) date picker to Laravel admin panels. It lets users select Shamsi dates and handles conversion for forms, making Persian date input simple and consistent, so you can build localized Filament apps without manual date conversion.
This release (v2.0.1) is a compatibility patch — the only stated change is support for Laravel 11 and 12. There are no new features or API changes advertised, so treat the upgrade as a constraint-widening exercise rather than a code migration. That said, since no prior assessment exists, the workflow below doubles as the baseline onboarding path.
php -v and your composer.json "php" constraint before touching the package.composer require vendor/package:^2.0.1 --dry-run (or composer update vendor/package --with-dependencies -W --dry-run) and read which illuminate/* versions Composer resolves. This tells you more about the release than the changelog does.composer.json (require / require-dev), the README's upgrade or requirements section, CHANGELOG.md for the 2.0.0 → 2.0.1 delta, and config/*.php for anything that changed shape.extra.laravel.providers; check php artisan about or php artisan package:discover output rather than assuming. Then php artisan vendor:publish --tag=<package>-config if a config file ships.Resolve from the container, not the facade, in application code. Bind the package's client/manager behind your own interface in a service provider and inject it. This keeps you insulated if a future major changes constructor signatures, and it makes the dependency trivially fakeable in tests.
Gate rollout behind config. If the package talks to an external service, route its enablement through a config value that reads from env(), defaulting to off in config/package.php and on per-environment. This lets you merge the upgrade and flip it per environment rather than in one deploy.
Test against both framework versions. Since the entire value of this release is L11 + L12 support, encode that assumption in CI: a matrix running the package's integration tests on orchestra/testbench for both majors (roughly ^9.0 for L11 and ^10.0 for L12 — confirm exact versions against the package's own require-dev). A single-version matrix silently defeats the point of the release.
Use fakes over network calls. Most packages in this space ship a ::fake() or an equivalent contract-level test double. Prefer that in feature tests and reserve real calls for a small number of tagged integration tests, so the suite stays fast and offline-safe.
Wire long-running work into the queue. If the package exposes synchronous calls that hit I/O, wrap them in a job with $tries/$backoff set explicitly, and dispatch after commit (->afterCommit() or after_commit = true) so a rolled-back transaction doesn't emit work.
Schedule through the scheduler, not cron. Register recurring package operations in routes/console.php or Kernel::schedule() with withoutOverlapping() and onOneServer() where the underlying operation isn't idempotent.
Upgrade sequence for existing installs: pin ^2.0.1, run composer update vendor/package -W, run the full suite, then scan storage/logs/laravel.log for deprecation notices emitted during boot — L11 removed a number of deprecated internals, and packages that touch them often warn rather than fail.
-W matters. Without --with-dependencies, Composer may keep an older illuminate/support pinned by a sibling package, and you'll get a resolution failure that looks like the package is broken when it's actually a transitive conflict.orchestra/testbench with the framework major; a stale testbench produces confusing "class not found" errors in setUp().php artisan config:clear && php artisan cache:clear. A cached config from the previous major is a classic source of "my new config key is ignored."bootstrap/providers.php (L11+) lists the provider explicitly, package auto-discovery may be bypassed, and you'll be running a stale provider after the upgrade.error_reporting(E_ALL) locally so you see them before production does.app()->make(Vendor\Package\Client::class) in tinker confirms the container binding; dump(config('package')) confirms config load order. These two checks resolve the majority of "package doesn't work after upgrade" reports.AppServiceProvider::register(), config-driven driver/manager selection (extend() on the manager if one is exposed), and macros if the package returns an Illuminate\Support\Collection or a Macroable trait.composer.lock and pin the package to ^2.0.1 rather than ^2.0 if you want the L11/L12 support guaranteed on fresh installs; ^2.0 permits resolution below the patched floor.How can I help you explore Laravel packages today?