Installation
composer require cariboo/doctrine-cariboo
Ensure doctrine/orm is installed (this package extends Doctrine ORM).
First Use Case: Basic Entity Extension
Add the package’s Cariboo\Doctrine\Extensions\* traits to your Doctrine entities. Example:
use Cariboo\Doctrine\Extensions\SoftDeletable\SoftDeletableTrait;
#[ORM\Entity]
class User
{
use SoftDeletableTrait;
// ...
}
src/Extensions for available traits.config/doctrine-cariboo.php (if published) for global configurations.Soft Deletes
SoftDeletableTrait and configure the deletedAt column.$repository->findAll(['deletedAt' => null]); // Non-deleted
$repository->findAll(['deletedAt' => null, 'withDeleted' => true]); // All (including soft-deleted)
prePersist/preRemove in your entity to auto-set deletedAt.Audit Logging
AuditLoggableTrait to track changes:
use Cariboo\Doctrine\Extensions\AuditLoggable\AuditLoggableTrait;
class Product
{
use AuditLoggableTrait;
// ...
}
config/doctrine-cariboo.php:
'audit_log' => [
'table_name' => 'product_audit_logs',
],
Sluggable URLs
SluggableTrait to generate slugs from a field (e.g., title):
use Cariboo\Doctrine\Extensions\Sluggable\SluggableTrait;
class BlogPost
{
use SluggableTrait;
#[ORM\Column]
private string $title;
#[ORM\Column(length: 255, unique: true)]
private string $slug;
public function getSlugSource(): string
{
return $this->title;
}
}
$entity->generateSlug() before saving.Event Dispatching
postPersist) with EventDispatcherTrait:
use Cariboo\Doctrine\Extensions\EventDispatcher\EventDispatcherTrait;
class Order
{
use EventDispatcherTrait;
protected function dispatchEvents(): void
{
$this->dispatch('order.created', $this);
}
}
findActive() for soft deletes).deletedAt, slug) via Laravel migrations.Missing Configuration
AuditLoggable require a configured table. Forgetting to publish/config the package may cause silent failures.php artisan vendor:publish --tag=doctrine-cariboo-config and update config/doctrine-cariboo.php.Trait Conflicts
prePersist in multiple traits) can cause issues.parent::method() to chain trait logic or override explicitly.Slug Uniqueness
SluggableTrait does not enforce uniqueness by default. Add a unique constraint to the slug column in your migration:
$table->string('slug')->unique();
Soft Deletes and Queries
withDeleted: true in queries will exclude soft-deleted records, even if the trait is applied.deletedAt is null in your query builder:
$qb->andWhere('u.deletedAt IS NULL');
Event Dispatching Order
EventDispatcherTrait run after Doctrine’s default events. Use EventDispatcher::DISPATCHER_PRIORITY_* constants to adjust priority.Customizing Audit Logs
getAuditLogData() in your entity to include/exclude fields:
protected function getAuditLogData(): array
{
return [
'old_data' => $this->getChanges(),
'custom_field' => $this->getCustomField(),
];
}
Dynamic Slug Sources
getSlugSource() dynamically (e.g., based on locale):
public function getSlugSource(): string
{
return $this->title . '-' . app()->getLocale();
}
Adding New Extensions
src/Extensions/.prePersist, postLoad).$entityManager->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
get_class_methods(\stdClass::class) to inspect loaded traits at runtime.$qb->getQuery()->getSQL(); // Debug SQL
How can I help you explore Laravel packages today?