This bundle is used for development at UmanIT.
It provides multiple tools and rules to ease development.
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\Exceptionclass.
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')
;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) andsetInStore/getFromStore(scalars), so child factories can accumulate state between persists without declaring static properties (which PHPStan flags on@immutableFoundry factories). The store is reset automatically viaResetInterface.
Rules for PHPStan:
EnsureFunctionBackslashRule: Ensure that some optimizable functions are called with backslash.NoWhereOnQueryBuilderRule: Disallow to usewheremethod onQueryBuilderin favor ofandWhere.
Edit your phpstan.neon file to include the following:
rules:
- Umanit\DevBundle\PHPStan\Rules\EnsureFunctionBackslashRule
- Umanit\DevBundle\PHPStan\Rules\NoWhereOnQueryBuilderRuleA 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.
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();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.
In your test:
TestUtils::setId($entity, 42);