stof/doctrine-extensions-bundle
Install the Bundle
composer require stof/doctrine-extensions-bundle
Enable in config/bundles.php:
Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true],
Configure Doctrine Extensions
Add to config/packages/doctrine.yaml:
stof_doctrine_extensions:
orm:
default:
timestampable: true
tree: true
sluggable: true
# ... other extensions
First Use Case: Timestampable Entities
Annotate an entity with @ORM\HasLifecycleCallbacks and use Timestampable:
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @Gedmo\Timestampable(on="create")
*/
class Post
{
// ...
}
Run migrations (php bin/console doctrine:migrations:diff).
Tree Structures (Nested Set)
@Gedmo\Tree for hierarchical data (e.g., categories)./**
* @Gedmo\Tree(type="nested")
*/
class Category
{
// ...
}
getChildren() or getParent().Slug Generation
@Gedmo\Slug.sluggable config:
stof_doctrine_extensions:
orm:
default:
sluggable:
fields: ["title"]
separator: "-"
Soft Deletes
@Gedmo\SoftDeleteable.->where('deletedAt IS NULL').Loggable Changes
@Gedmo\Loggable.config/packages/doctrine.yaml:
stof_doctrine_extensions:
orm:
default:
loggable: true
AbstractExtension.prePersist, preUpdate for validation (e.g., slug uniqueness).Missing Migrations
doctrine:migrations:diff after adding new extensions (e.g., tree, sluggable).ALTER TABLE posts ADD COLUMN lft INT.Circular References in Trees
Slug Conflicts
unique config:
sluggable:
unique: true
Performance with Loggable
Enable SQL Logging
doctrine:
dbal:
logging: true
Check for unexpected queries (e.g., UPDATE on soft deletes).
Check Event Order
Use debug:event-dispatcher to verify extension listeners fire correctly.
Custom Slug Strategies
Override Stoke\DoctrineExtensions\Sluggable\SluggableListener for dynamic slugs.
Tree Traversal
Extend Gedmo\Tree\TreeListener for custom path queries (e.g., depth-limited trees).
Timestampable Formatting
Format timestamps via setDateTimeFormat() in the listener.
Soft Delete Queries
Override getQuery() in SoftDeleteableListener to exclude soft-deleted records by default.
orm: { default: { ... }, Your\Entity: { timestampable: false } }.stof_doctrine_extensions.orm.How can I help you explore Laravel packages today?