Troubleshooting
php artisan awn:extensions:validate
php artisan route:list -v --name=plugin
php artisan migrate:status
php artisan view:cache
php artisan test --compact
- Manifest/driver missing: check enum driver/directory, namespace case, JSON, exact slug, enums, Composer autoload. A row cannot discover code.
- Validation error: follow its exact missing route, duplicate pattern, route-prefix, site-view/thumbnail, slot rendering/capability, or normalization message.
- Enable fails: distinguish uninstalled, inactive, incompatible, CMS collision, and invalid definition.
- Contribution absent: check effective state, theme compatibility, cache, interface, declaration, route, and view.
requiresEnabled: falsecurrently does not show disabled dashboards. - Management link opens plugin settings: the package dashboard route collides with
/plugins/{slug}. Move management to/plugins/{slug}/manage;awn:extensions:validaterejects this collision. - Plugin page 404: check published site, effective plugin, pattern segments, publication scope, and signed preview.
- Action 404: expected for unresolved/inactive/unpublished/unavailable state.
- Tenant row absent: verify context; use
CurrentOrganization::run()outside HTTP, never request ownership. - Stale output: clear cache and ensure managers invalidated exact v2 tenant keys; restart long-running workers after payload/class changes.
- Theme switch blocked: disable the incompatible plugin if acceptable; failed switch preserves state.
- Styles missing: use literal Tailwind classes and rebuild Vite.
Events sample is absent
The seeder intentionally skips non-local/non-testing environments and only visits organizations that already exist when it runs. In local/testing it enters each tenant context and idempotently creates community-open-day.
View missing
Check provider, enum, directory, namespace (theme.{slug}/plugin.{slug}), and view cache. Every plugin enum package needs routes/web.php.
Fundraising proof cannot be opened
Confirm the donation has proof_path, the file exists on Storage::disk('local'), the request is authenticated inside the donation's organization, and the Fundraising plugin is effectively enabled. Do not repair this by linking storage/app/private into public; proofs must be streamed by plugin.fundraising.dashboard.donations.proof.
Fundraising demo projects are absent
FundraisingSeeder intentionally skips non-local/non-testing environments. In local/testing, install or reinstall Fundraising after an organization exists; the idempotent seeder enters each organization context and creates the demo channel, projects, and trend donations.