Installation:
composer require gedmo/doctrine-extensions
Add to config/app.php under providers (if using Doctrine via Laravel Doctrine or similar):
Gedmo\DoctrineExtensions\ServiceProvider::class,
Enable in Doctrine:
Configure in your Doctrine config (e.g., config/doctrine.php):
'orm' => [
'entity_managers' => [
'default' => [
'extensions' => [
'Gedmo\\DoctrineExtensions\\Timestampable\\TimestampableListener',
'Gedmo\\DoctrineExtensions\\SoftDeleteable\\SoftDeleteableListener',
// Add other listeners as needed
],
],
],
],
First Use Case:
Add a Timestampable entity to track creation/modification:
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @Gedmo\Timestampable(on="create")
*/
class Post
{
/**
* @var \DateTime
* @Gedmo\Timestampable(on="create")
*/
private $createdAt;
/**
* @var \DateTime
* @Gedmo\Timestampable(on="update")
*/
private $updatedAt;
}
Run migrations (php artisan doctrine:migrations:diff + php artisan doctrine:migrations:migrate).
Timestampable:
@Gedmo\Timestampable on properties or class level.setCreatedAt()/setUpdatedAt() if custom logic is needed.createdAt/updatedAt.SoftDeleteable:
deletedAt column (type: datetime, nullable).->whereNull('deletedAt') or use SoftDeleteableQueryBuilder.->forceDelete().Slugable:
Gedmo\Sluggable:
fields: ['title']
separator: '-'
Tree:
@Gedmo\TreeType.getChildren(), getParent(), or getRoot() methods.->rebuildTree().Loggable:
@Gedmo\Loggable.getLogEntries() or query via LogEntry entity.prePersist, preUpdate, or postFlush to extend behavior (e.g., validate slugs before save).->where('deletedAt IS NULL') for soft-deleted models.Gedmo\Mapping\LifecycleEventArgs interfaces.Timestampable with Gedmo\MongoDB\Timestampable\TimestampableListener for ODM.Listener Registration:
extensions array).config/doctrine.php.Column Mismatches:
@Gedmo\Timestampable to a non-datetime column.datetime for createdAt).Tree Rebuilding:
->rebuildTree() can corrupt hierarchy.rebuildTree() after bulk updates.Soft Deletes in Queries:
deletedAt in queries returns soft-deleted records.->whereNull('deletedAt') or SoftDeleteableQueryBuilder.Slug Conflicts:
onDuplicate logic in setSlug() or use a unique constraint.Listener Not Triggering:
dump($entityManager->getEventManager()->getListeners()).Timestamp Overrides:
createdAt updates on save, override setCreatedAt() to throw an exception.Tree Path Errors:
->getPath() to debug hierarchy issues (e.g., circular references).Custom Events:
Gedmo\Mapping\LifecycleEventArgs for custom behaviors (e.g., trigger actions on preUpdate).Field Mapping:
getSlugSource() in entities to dynamically set slug fields.MongoDB Adaptations:
Gedmo\MongoDB\Timestampable).Validation:
prePersist listeners to validate fields (e.g., slug length) before save.createdAt/updatedAt use consistent timezones (configure in config/app.php).Tree) have separate ODM implementations.php artisan cache:clear) after adding new listeners.How can I help you explore Laravel packages today?