keyopstech/shtumi-useful-bundle
Shtumi Useful Bundle by Keyopstech is a Symfony utility package that collects reusable helpers and practical components to reduce boilerplate and speed up common backend development tasks. Install via Composer and drop it into your Symfony app for a convenient set of everyday PHP tools.
Reality check first: this is not a Laravel package. It's a Symfony 2 bundle, last touched in 2018, with 1 star and zero dependents. composer require keyopstech/shtumi-useful-bundle will happily resolve inside a Laravel app and then do absolutely nothing — there is no service provider, no extra.laravel block, no facade, no config publish tag. All the wiring lives in Symfony-land: AppKernel::registerBundles(), a DependencyInjection/*Extension, and service tags for Form types, Twig extensions, and Doctrine DQL functions.
So before you write a line of code, read these in order:
composer.json — the require block is the gatekeeper. Expect symfony/symfony ~2.x and a PHP constraint that blocks installation on PHP 8, which means it won't coexist with any current Laravel version.README.md — usually lists the form types, DQL functions, and Twig filters with usage snippets. This is the best documentation you'll get; there's no docs site.DependencyInjection/ — shows what's registered by default and what config keys exist. This is the map for everything else.Form/Type/ (custom form types), Doctrine/ (DQL function classes), Twig/ (extension classes). These are the actual value.Your first concrete use case is almost certainly pattern mining, not installation. Skim the Twig extensions and DQL functions — those are the two things that map cleanly onto Laravel primitives, and you can reimplement each one in under twenty lines. The only scenario where you actually install this is if you're maintaining a legacy Symfony 2/3 app in parallel; in that case register the bundle in AppKernel, import its config, and start by using a single form type in one controller rather than adopting the whole bundle at once.
Treat the bundle as a reference implementation and port features one at a time. The mapping is straightforward:
| Bundle feature | Laravel equivalent |
|---|---|
| Twig extension (truncate, date formatting, etc.) | Blade directive, helper function, or Str macro |
Doctrine DQL function (DATE(), MONTH(), etc.) |
selectRaw(), DB::raw(), or a query-builder macro |
| Custom form type | FormRequest + validation rules + Blade component or Livewire component |
| Autocomplete form type | Select2/Choices.js + a JSON endpoint controller |
| Date picker / date range type | Flatpickr + a Blade component with a name/value contract |
| Date range validation | A small custom rule or after_or_equal with two fields |
Porting a Twig filter to Blade. Find the extension class, note the method body, then register a directive in a service provider:
Blade::directive('truncate', function ($expression) {
return "<?php echo e(\\Illuminate\\Support\\Str::limit($expression)); ?>";
});
Keep the directive name identical to the Twig filter name if you're migrating templates — it makes a grep-and-replace migration possible instead of a manual rewrite.
Porting a DQL function. The bundle's DQL functions exist because Doctrine couldn't express date math portably. In Laravel you don't need a function class, just raw SQL:
Order::selectRaw('DATE(created_at) as day, COUNT(*) as total')
->groupBy('day')
->get();
If you repeat it often, register a Builder macro in a service provider rather than scattering selectRaw calls.
Porting a custom form type. In Symfony the form type encapsulates rendering + validation. In Laravel that splits into three pieces: a FormRequest rule, a Blade component for the markup, and a controller that composes them. A date-range form type becomes a <x-date-range> component plus a array $dates validation rule.
Coexistence pattern. If you genuinely must run both apps, vendor the bundle into a Legacy\ namespace and never reference its classes from Laravel code directly — wrap each call behind a small adapter. This keeps your Laravel side free of Symfony's Component\Form dependency graph.
composer require on a Laravel 10/11 app fails or, worse, resolves an ancient transitive set. Check composer why-not before assuming it's a code problem.dql: config key. If you copy a function class and it "doesn't exist" at query time, the registration is what's missing — not the class.load(), not in a YAML file. If you're mirroring config behavior, read the extension rather than the docs.{{ my_filter(x) }} or a DQL DATE() work inside Blade/Eloquent. Reimplement, don't shim.symfony/form is a trap. It drags a half-dozen Symfony components and an event dispatcher you'll never use. The form type you wanted was probably 40 lines of HTML.Bottom line for a Laravel developer: don't install it. Spend thirty minutes reading Twig/, Doctrine/, and Form/Type/, port the two or three helpers that actually save you time, and move on.
How can I help you explore Laravel packages today?