Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Nova Left Resource Index Links Laravel Package

tanmuhittin/nova-left-resource-index-links

A Laravel Nova package that adds resource index links to the left sidebar, making it faster to jump between Nova resources from the navigation menu. Simple to install and configure for cleaner, quicker resource navigation.

View on GitHub
Deep Wiki
Context7

Getting Started

  • Install with composer require <vendor>/<package> and confirm the service provider is auto-discovered (php artisan vendor:publish --provider="<Vendor>\<Package>\<Package>ServiceProvider" will list publishable groups if discovery worked). If the package is 0.1.x, pin the version ("^0.1") rather than using dev-main in anything shared.
  • First place to look is the package's config/ file after publishing — almost every behavioural decision in a Laravel package lives there, and defaults are usually tuned for local development, not production.
  • Before writing integration code, read the provider's register() vs boot() split. What is bound in register() (singletons, interfaces, facades) is what you can safely resolve in your own register() methods; anything touching routes, views, migrations, or Artisan::command is boot()-only.
  • First use case to validate: a single happy-path call through the public API (facade or injected contract) inside php artisan tinker, with the config published and cached off. If that works, the wiring is sound and remaining problems are almost always config or caching.
  • Run the package's own migrations before anything else if it ships them: php artisan vendor:publish --tag=<package>-migrations then php artisan migrate. Check whether published migrations are meant to stay in database/migrations (editable) or are loaded directly from the package (not editable) — this determines whether you can add indexes or columns later without forking.

Implementation Patterns

  • Depend on the contract, not the facade. Bind the package's interface in your own service provider and inject it. Facades are convenient in controllers and Blade, but constructor injection is what keeps you able to swap the implementation in tests and to survive a facade alias change in a minor release.
  • Config over code. Any package-level behaviour you might want to tune per environment (timeouts, table names, queue names, drivers) should be pushed into the published config and read at runtime, not hard-coded at the call site. Then use env-specific .env keys in staging/production and keep the config file itself identical across environments.
  • Wrap the package behind a thin adapter of your own for anything beyond a one-line call. A single App\Support\... class that wraps the package's API means an upgrade or a swap is a one-file change instead of a grep across the codebase. Do this the moment you call the package from more than two places.
  • Jobs and queues: if the package dispatches work, check whether its jobs are serialised with package models or with your models. If package models, ensure the queue worker has the same config cache as the web process, otherwise unserialisation will fail with a class-not-found or a config-mismatch after a deploy.
  • Testing: use RefreshDatabase plus the package's own published migrations in your test suite so tests exercise the same schema as production. For anything network-facing, bind a fake implementation of the package's interface in setUp() rather than hitting Http::fake() — faking at the contract level keeps tests fast and independent of the package's internal HTTP client choice.
  • Octane/Horizon: if you run Octane, verify the package doesn't hold request state in a singleton. Anything resolved as singleton in register() is shared across requests under Octane — check the provider for this explicitly before deploying.
  • Deploy order: composer install → config:cache → route:cache → migrate --force → queue:restart. Packages at 0.1.x frequently add config keys in patch releases; a stale bootstrap/cache/config.php is the single most common "it worked locally" failure.

Gotchas and Tips

  • Config caching is the number one trap. env() calls inside a package config file return null once config:cache has run. If a value looks correct in tinker but wrong in a cached deploy, that's the cause — the fix belongs in the package's config file, not in your app code, so report it upstream.
  • Publish tags are version-sensitive. Re-publishing after an upgrade overwrites your local edits silently. Keep every change you make to a published config or migration in a diff-able place (a git commit that names the package version), and re-check the package's stub against yours on every bump.
  • 0.x semver means breaking changes land in patch releases. Treat every 0.1.x → 0.1.y bump as potentially breaking. Read the diff of src/ between tags, not just the release notes, and run your integration tests against the new version in CI before merging.
  • Facade aliases and auto-discovery can collide. If two packages register the same alias, the last one discovered wins and the error surfaces as a confusing "class not found" at runtime rather than at boot. Check config/app.php aliases and composer.json extra.laravel.aliases when something resolves to the wrong class.
  • Debugging: php artisan about shows discovered providers and cache status; php artisan tinker with app()->bound('<Interface>') confirms binding; php artisan vendor:publish --provider=... --force is destructive and should never be in a deploy script.
  • Extension points to prefer — in rough order of stability at 0.1.x: published config, published migrations, container bindings to interfaces, events the package dispatches, macros on its classes. Prefer the top of that list. Avoid extending package classes directly and avoid overriding protected methods; both break without notice in 0.x.
  • Log a canary. Wrap the first production call in a try/catch that logs the package version (Composer\InstalledVersions::getPrettyVersion(...)) alongside the exception. When a patch release misbehaves, having the version in the log turns a day of bisecting into a two-minute read.
  • Check the issue tracker before adopting. For a 0.1.x package, the ratio of open issues to commits in the last 90 days is a better signal of fitness than the feature list. If the package is unmaintained, keep it behind your adapter so removal stays cheap.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core