Download the PHP package topotru/psalm-conditional-final without Composer
On this page you can find all versions of the php package topotru/psalm-conditional-final. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download topotru/psalm-conditional-final
More information about topotru/psalm-conditional-final
Files in topotru/psalm-conditional-final
Package psalm-conditional-final
Short Description Smart final/abstract class enforcement with attributes-based exclusions for Psalm. Perfect for Doctrine entities.
License MIT
Informations about the package psalm-conditional-final
Conditional Final for Psalm
Smart final/abstract class enforcement with attributes-based exclusions for Psalm.
Enforce final or abstract on your PHP classes without breaking your Doctrine Entities or other proxy-reliant classes.
This plugin replaces dumb token-based linters (like PHPCS) with smart, attributes-aware architectural control on top of the Psalm static analysis engine.
The Problem
Standard linters (e.g., SlevomatCodingStandard.Classes.RequireAbstractOrFinal) force you to make every class final. However, Doctrine Entities (or MappedSuperclasses) must not be final because Doctrine needs to extend them to generate lazy-loading proxy classes at runtime.
If you accidentally make an Entity final, it usually works fine in dev environment but crashes with a Fatal Error on production. To avoid this, you are forced to litter your codebase with ugly comments:
The Solution
Conditional Final reverses the logic:
- Every class must be
finalorabstractby default. - If a class has a forbidden attribute (like
#[ORM\Entity]), it must not befinal(protects your production). - Completely config-driven. No more inline ignore comments!
- Zero-dependency core (does not require
doctrine/ormto be installed).
Installation
Enable the plugin in your psalm.xml:
Configuration
By default, the plugin requires all classes to be final or abstract and has an empty exclusion list.
Integration with Doctrine ORM
To enable the built-in preset for Doctrine (#[Entity] and #[MappedSuperclass]), simply add the <useDoctrinePreset /> tag inside the plugin configuration in your psalm.xml:
Custom Configurations
You can add any custom proxy or framework attributes (like API Platform or custom annotations) to the exclusion list manually inside the forbiddenFinalAttributes section:
Errors Handled
ClassShouldNotBeFinal— Triggers when an entity/proxy class is accidentally marked asfinal(prevents production crashes).ClassShouldBeFinal— Triggers when a standard class (service, repository, etc.) misses thefinalkeyword.
License
The MIT License (MIT). Please see License File for more information.