marcw/wurst-bundle
A Symfony bundle that integrates Wurst into Symfony applications. It wires Wurst’s services and configuration into the framework, letting developers use its features with familiar Symfony conventions and minimal setup.
This is a Symfony bundle that renders ASCII-art würst (sausages) to the console. There is no Laravel service provider, no config publishing, and no Artisan command — so "getting started" in a Laravel codebase means copying the output, not installing the package.
Minimal steps:
# Do NOT `composer require` this in a Laravel app — it drags in symfony/framework-bundle.
# Instead, fetch the source as reference material only.
git clone https://github.com/marcw/MarcWWurstBundle /tmp/wurst-reference
Command/ directory in the clone. The whole payload is a handful of hardcoded ASCII strings behind a Symfony Command subclass — you can absorb it in five minutes.php artisan make:command WurstCommand — and paste the art into a resources/ stub or a const array, with a header comment citing the upstream repo, commit SHA, and license.app()->environment('local'), so it never appears as an unexplained binary in a hardened production container.composer install. That's the entire feature surface.Where to look first: the command class, not the bundle registration. The bundle wiring (MarcWWurstBundle in bundles.php) is Symfony-specific and irrelevant to Laravel — ignore it entirely.
Vendored command, not a dependency. The only defensible pattern. Ship app/Console/Commands/WurstCommand.php with the art inlined or in a stub file. No service provider, no bundle registration, no composer.json entry.
class WurstCommand extends Command
{
protected $signature = 'wurst';
protected $description = 'Prints some nice würst to your shell';
public function handle(): int
{
if (! app()->environment('local')) {
return self::SUCCESS;
}
$this->line(file_get_contents(resource_path('ascii/wurst.txt')));
return self::SUCCESS;
}
}
Composer lifecycle hook (local only). Wire it to post-install-cmd for developer delight, but keep it out of CI images where log noise matters. Make it non-blocking so a removed command never fails the build:
"scripts": {
"post-install-cmd": ["@php artisan wurst || true"]
}
Artisan Command event listener. Laravel fires Illuminate\Console\Events\CommandStarting / CommandFinished. If you want the banner on every command, listen there and print only when $event->output->isDecorated() is true — piped logs and CI stay clean:
Event::listen(CommandFinished::class, function ($event) {
if (app()->environment('local') && $event->output->isDecorated()) {
// render your wurst
}
});
As a teaching template. The highest-leverage use is studying bundle structure — a thin bundle, a small config tree, one command. It's a readable end-to-end example for onboarding docs or a "how a Symfony bundle works" workshop. That value is cultural, not functional.
--ignore-platform-reqs — which silently degrades dependency resolution for the whole app. This is the primary reason to vendor rather than depend.composer require it into a production app that has a maintenance policy. It's archived, single-maintainer, zero dependents, with no security response channel. Treat the repo as read-only reference material.ü; Windows terminals and some CI log consumers render mojibake. Add a UTF-8 assertion in a test, or ship an ASCII-only fallback.bin/console list | grep -i wurst — names aren't reliably documented.$this->laravel->environment(['local']) early-return (or app()->environment('local')) so the command is inert on staging demos and production. Land it in an isolated, revertible PR — no bundling with other console tooling changes.Laravel Prompts or Symfony Console styles so output stays consistent with the rest of your tooling.The honest framing: this is a "copy the two files, delete the rest" candidate. Its value is developer morale, scoped as a small time-boxed novelty — not a platform decision.
How can I help you explore Laravel packages today?