phpviet/symfony-number-to-words
Symfony bundle from phpviet that converts numbers into Vietnamese words for invoices, receipts, and legal documents. Offers a service and Twig filter to spell out amounts with currency support and configurable settings, giving Symfony apps simple, reliable number-to-text output.
composer require <vendor>/<package>; on Laravel 5.5+ the service provider and facade are auto-discovered via extra.laravel in the package's composer.json. Confirm with php artisan about or composer show <vendor>/<package> before debugging anything else.php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider" (add --tag=config to limit scope). Reading the published config file is the fastest way to understand what the package actually does — it documents the real surface area far better than the README.src/*ServiceProvider.php (register() shows bindings and singletons, boot() shows routes, migrations, commands, Blade directives), then any Contracts/ directory. That tells you what is swappable and what is hard-wired.php artisan migrate on a scratch database first and inspect the generated schema — column types and indexes are the most common source of later friction.App\Services\FooService) that you bind in your own provider. Call sites depend on your class, not the vendor's. This is the single highest-leverage decision for a 1.x dependency — it makes an eventual swap or a fork a one-file change.AppServiceProvider::register() rather than resolving the facade everywhere. Facades are fine at the edges (Blade, controllers); constructor-injected contracts are better in domain code.config/<package>.php with env() defaults, then overridden per environment. Never edit vendor files, and never call setters at runtime for values that belong in config.Package::fake() or a HTTP fake integration, use it in the suite; fall back to Http::fake() or container swapping ($this->swap(Client::class, $mock)) otherwise. Assert on your wrapper's output, not on the package's internals.$this->app->scoped(...)) rather than a singleton if config or credentials vary per request.php artisan config:clear (and route:clear / view:clear if the package registers routes or views). Deploy pipelines that run config:cache will happily serve the pre-publish defaults.require-dev, or composer dump-autoload was never run after install, nothing registers and the failure looks like a class-not-found rather than a missing provider. Check bootstrap/cache/packages.php.config/app.php is unnecessary on modern Laravel and will shadow an existing alias. Import the class instead.scoped() and reset state in a listener if the package has no reset hook.--force is destructive. vendor:publish --force overwrites local edits to published config and migrations. Diff before doing it, and prefer --tag to republish only what you changed.1.0.0 tag usually pins an illuminate/support range. Before upgrading your framework, check composer why-not — the package is often the last blocker, and a ^1.0 constraint on the package plus ^11.0 on the framework is the combination to verify first.$this->app->extend() the resolved instance, (3) a decorator implementing the same interface, (4) fork. Registering your provider before the package's in config/app.php lets you seed values its boot() reads.php artisan about for discovered providers, php artisan tinker to inspect the resolved binding (app(Foo::class)), Log::debug() inside your wrapper to confirm you are hitting the real implementation and not a cached or faked one.^1.0, read the changelog for 1.x minors (they should be additive), and expect breaking changes only at 2.0. Anything you cannot express through config or a rebind is a fork risk — note it now rather than after the second call site lands.How can I help you explore Laravel packages today?