rodgermd/sftools-bundle
SfToolsBundle is a lightweight Symfony bundle that gathers handy developer tools and helper utilities—services, console commands, and reusable components—to simplify common tasks, reduce boilerplate, and speed up development of PHP and Symfony applications.
This is a Symfony bundle, not a Laravel package — there is no ServiceProvider, no config/sftools.php, and no facade. Before installing anything, confirm you actually need it: last tagged release is from early 2018, it has essentially no adoption, and its dependency constraints almost certainly target Symfony 2.x/3.x era PHP. If you're on a modern Laravel stack, the realistic path is to read the source and copy the handful of helper classes you need, not to composer require the bundle.
If you still want to evaluate it directly:
composer.json (PHP/Symfony version constraints), DependencyInjection/ (what services get registered), Resources/config/ (service definitions), Twig/ or Helper/ (the actual useful logic), and Form/Type/ (widgets).composer require rodgermd/sftools-bundle and register Rodger\SfToolsBundle\RodgerSfToolsBundle in AppKernel::registerBundles() (or config/bundles.php on Symfony 4+, where it will likely fail on version constraints).app/Support/SfTools/, fix namespaces, and register the ones you need in a small service provider.Your first useful use case is almost always the Twig/helper utilities — render one of the provided widgets or call one helper in a template (or, in Blade, wrap the helper in a directive) to confirm the class actually works on your PHP version. Build that single vertical slice before wiring anything else.
Treat it as a source of utilities, not a framework integration. The bundle bundles unrelated "tools and widgets"; cherry-pick.
DependencyInjection/*Extension.php loads Resources/config/services.*. After registering the bundle, run bin/console debug:container --show-private | grep -i rodger to see what actually got registered — this is the fastest way to learn the public surface.Twig\Extension\* class exists, register it explicitly rather than relying on the bundle's autoconfiguration (which was written before autoconfigure existed):
services:
Rodger\SfToolsBundle\Twig\SomeExtension:
tags: [twig.extension]
->add('field', SomeWidgetType::class)), then override their templates via Resources/views/ overrides in your app, which is the cleanest extension point this bundle offers.// app/Providers/SfToolsServiceProvider.php
public function register(): void
{
$this->app->singleton(\App\Support\SfTools\SomeHelper::class, fn () => new \App\Support\SfTools\SomeHelper());
}
For template helpers, expose them via a Blade directive:
Blade::directive('sftool', fn ($expr) => "<?php echo app(\App\Support\SfTools\SomeHelper::class)->render($expr); ?>");
assertSame on the helper's output for a known input) immediately after copying any class. These old bundles have zero tests and undocumented edge behavior; the test is your only regression net before you start editing namespaces and type hints.path or VCS repository. That gives you the ability to patch PHP-version incompatibilities without fighting an unmaintained upstream.php artisan vendor:publish does not apply. Plan for manual wiring or extraction.each(), create_function, implicit nullable parameters, getMock() in any bundled tests). Run composer why-not php / check the constraint before wasting time.Rodger\SfToolsBundle\...). After copying files, run composer dump-autoload -o and verify with php -r "class_exists('...');" before assuming a silent failure is a logic bug.Resources/views path isn't registered. On Symfony 4+, verify the bundle path is actually in the Twig loader paths; on a port, copy the templates into resources/views/vendor/sftools/.debug:container --tag=twig.extension and debug:container --parameter are your friends — old bundles frequently register services under generic IDs that collide with your own.config.yml with no validation and no defaults. If a helper returns null unexpectedly, check whether an Extension::load() default is missing rather than debugging the helper itself.final-less but non-injectable.How can I help you explore Laravel packages today?