umanit/dev-bundle

Helper classes and dependencies for usual dev environment

Maintainers

Package info

github.com/umanit/dev-bundle

Type:symfony-bundle

pkg:composer/umanit/dev-bundle

Statistics

Installs: 2 325

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

3.2.0 2026-06-01 13:57 UTC

This package is auto-updated.

Last update: 2026-06-01 13:58:20 UTC


README

This bundle is used for development at UmanIT.

It provides multiple tools and rules to ease development.

PHP Arkitect

Rules for PHP Arkitect:

  • NotAbuseFinalUsage: Disallow to use final classes if at least one public method of your class is called in another public method of the same class.
  • NotUseConcreteWhenInterfaceExists: Disallow the use of a concrete class inside typehint if an interface exists for tha class.
  • NotUseGenericException: Disallow the use of generic \Exception class.

Usage

Edit your arkitect.php file to include the following:

use Arkitect\Expression\ForClasses\ResideInOneOfTheseNamespaces;
use Umanit\DevBundle\Arkitect\Expression\ForClasses\NotAbuseFinalUsage;
use Umanit\DevBundle\Arkitect\Expression\ForClasses\NotUseGenericException;

// [...]

$rules[] = Rule
    ::allClasses()
    ->that(new ResideInOneOfTheseNamespaces('App'))
    ->should(new NotUseGenericException())
    ->because('we want to force usage of SPL exceptions or custom ones')
;

$rules[] = Rule
    ::allClasses()
    ->that(new ResideInOneOfTheseNamespaces('App'))
    ->should(new NotUseConcreteWhenInterfaceExists())
    ->because('we want to depend on interfaces, not concrete implementations')
;

$rules[] = Rule
    ::allClasses()
    ->that(new ResideInOneOfTheseNamespaces('App'))
    ->should(new NotAbuseFinalUsage())
    ->because('we want avoid final classes which reduce extensibility')
;

Foundry

Various tools to ease tests creation:

  • A database reseter usable as a Symfony command.
  • Some utilities function to ease the creation of entities.
  • Possibility to use aliases on Doctrine entities within factories.
  • A per-class key/value store accessible via addToStore/getListFromStore (lists) and setInStore/getFromStore (scalars), so child factories can accumulate state between persists without declaring static properties (which PHPStan flags on @immutable Foundry factories). The store is reset automatically via ResetInterface.

PHPStan

Rules for PHPStan:

  • EnsureFunctionBackslashRule: Ensure that some optimizable functions are called with backslash.
  • NoWhereOnQueryBuilderRule: Disallow to use where method on QueryBuilder in favor of andWhere.

Usage

Edit your phpstan.neon file to include the following:

rules:
    - Umanit\DevBundle\PHPStan\Rules\EnsureFunctionBackslashRule
    - Umanit\DevBundle\PHPStan\Rules\NoWhereOnQueryBuilderRule

TestEventDispatcher

A test double for Symfony's EventDispatcher that records all dispatched events so they can be inspected and asserted on in tests without triggering real listeners.

Usage

Bind TestEventDispatcher as the EventDispatcherInterface service in your test environment, then assert on the events after the action under test:

$event = $dispatcher->getLastDispatchedEvent(MyEvent::class);
$this->assertInstanceOf(MyEvent::class, $event);

// All events dispatched under a given name
$events = $dispatcher->getDispatchedEvents(MyEvent::class);

// Full map of every dispatched event
$all = $dispatcher->getAllDispatchedEvents();

TestUtils

One static method TestUtils::setId to set the id of an entity by reflection. Useful for tests when your entities do not expose a setId method.

Usage

In your test:

TestUtils::setId($entity, 42);