strnoar/dtoolsbundle
DtoolsBundle is a PHP/Laravel package that bundles reusable developer utilities and helpers into a single integration point, making it easier to add common tooling to your application and streamline everyday development tasks.
Treat this as an unknown-quantity Symfony bundle until proven otherwise. With zero stars and zero dependents, there is no community signal to lean on, so the first step is to read the source, not the README.
Step 1 — Confirm it's installable and compatible.
composer require strnoar/dtoolsbundle
Then check composer.json inside vendor/strnoar/dtoolsbundle immediately. Look for:
type: should be symfony-bundle.require: the Symfony version constraint. If it caps at ^4.4 or ^5.x, you're already in legacy territory and should stop and reconsider.autoload.psr-4: gives you the root namespace and therefore the class names you'll need to reference in config/bundles.php.Step 2 — Register the bundle. In config/bundles.php:
return [
// ...
Strnoar\DToolsBundle\DToolsBundle::class => ['all' => true],
];
Adjust the namespace to whatever the psr-4 block actually declares — do not assume it matches the package name, this is one of the most common mismatches in small bundles.
Step 3 — Discover the extension surface before writing any code. In vendor/strnoar/dtoolsbundle, inspect in this order:
DependencyInjection/ — the *Extension.php and Configuration.php tell you the entire config tree. This is the real documentation.Resources/config/ — services.yaml/services.xml reveals which services are public, tagged, or aliased. Aliases are how you'll inject things.Resources/routes/ or Routing/ — whether it ships controllers/routes at all.src/ — look for Command/, EventSubscriber/, Twig/, or Attribute/ directories. These tell you the intended interaction style (CLI, events, templating, or declarative attributes).composer.json extra key — sometimes carries installer hints or recipes.Step 4 — First use case. The realistic first win is whatever the bundle's Extension loads with load() at container build. Run:
php bin/console debug:container --show-private | grep -i dtools
Anything it registers will surface there. If nothing appears, the bundle may be purely a library shim (no services) — check for a DependencyInjection/Configuration.php with an empty or trivial tree. That's your signal it's thin enough that you might as well have copied the two classes into your own src/.
Step 5 — Smoke test. Clear the cache (bin/console cache:clear) and load a route. A bundle that fails at container compilation with no tests and no users is a bundle you want to know is broken before you build on it.
Config-first, code-second. Whatever the Configuration.php exposes, wire it into config/packages/d_tools.yaml (naming follows the extension alias, typically the lowercased/snake-cased bundle root) rather than calling services directly. Small bundles rarely keep BC on their service signatures, but the config tree is the one thing an author usually designs deliberately.
# config/packages/dtools.yaml
dtools:
# mirror the keys you found in Configuration.php exactly
Service injection via alias. If Resources/config/services.yaml declares an alias for the bundle's main service, prefer injecting by the interface/alias rather than the concrete Strnoar\...\Service\FooService FQCN. If no alias exists, you're coupled to the class name — a good moment to consider a thin adapter in your own src/:
final class MyDtoolsAdapter
{
public function __construct(private readonly \Strnoar\DToolsBundle\...\Foo $inner) {}
// your app's stable API on top
}
Wrap it, don't scatter it. With no test suite and no users upstream, the risk of the author renaming a public method is real. Isolate every call site behind one or two of your own services so a future fork/removal is a one-file change.
Composer constraints as a guardrail. Because it's unmaintained-by-popularity, pin it:
"require": {
"strnoar/dtoolsbundle": "dev-master"
},
"config": {
"preferred-install": { "strnoar/dtoolsbundle": "source" }
}
Installing from source gives you readable, debuggable vendor code and lets you apply a patch via a composer patch plugin if you hit a bug you must fix locally.
Fork as the integration tip of last resort. If the bundle turns out to be useful but abandoned, the healthiest day-to-day pattern is a fork under your org with "repositories": [{"type": "vcs", "url": "..."}] in composer.json. Then you own the Symfony version constraint and can run it against a modern Symfony.
If it registers a console command / event subscriber, prefer the bundle's integration points (#[AsCommand], EventSubscriberInterface) over extending its internals — those are the parts least likely to be rewritten.
strnoar, the repo is ArnaudTarroux/DToolsBundle, the package is strnoar/dtoolsbundle. Three different identities. Trust composer.json's psr-4 for the class namespace and nothing else.Definition method (setPublic, setAutowired) in the bundle's services.yaml, or a TreeBuilder signature change. The error surfaces as a vague ServiceNotFoundException or an InvalidArgumentException in ContainerBuilder. Grep the vendor services.yaml first.config/packages/*.yaml to be auto-generated. If composer require doesn't ask for a recipe install, you must register the bundle in config/bundles.php yourself — a silent no-op that wastes an hour if you forget.debug:container is your friend, not the README. --tagged, --parameter, and --show-private will enumerate everything the bundle contributes. There is no faster way to learn an unfamiliar bundle.public: true and you try $container->get('...') in a controller, you'll get ServiceNotFoundException even though debug:container shows it. Inject instead.bin/console cache:clear (and rm -rf var/cache/* if in dev with a stale container) before concluding something is broken.@internal until your own adapter pins it. Write a one-test smoke check in your suite that instantiates the main service and calls your adapter — cheap insurance against a silent vendor update.CompilerPass directories (you can decorate services yourself without touching vendor), interfaces you can implement, and Symfony's decorates: service attribute. Often you can shape the bundle's behavior from your own services.yaml without a fork.LICENSE and the last commit date. If it's GPL/AGPL with no activity, weigh that against your org's policy before adopting anything here.src/ in under an hour — for a bundle of this profile, that is very often the better day-to-day decision.How can I help you explore Laravel packages today?