dbstudios/doctrine-entities
Laravel package to work with Doctrine ORM entities in your app, providing integration helpers for managing Doctrine entities alongside Laravel’s ecosystem. Useful when you prefer Doctrine’s mapping and repositories over Eloquent for certain domains.
Installation Add the package via Composer:
composer require dbstudios/doctrine-entities
Publish the config (if needed):
php artisan vendor:publish --provider="Dbstudios\DoctrineEntities\DoctrineEntitiesServiceProvider"
Basic Usage
Register a Doctrine entity in config/doctrine-entities.php:
'entities' => [
'App\Models\User' => [
'entity' => 'User',
'namespace' => 'App\\Entities',
],
],
Generate the entity class (if not auto-generated):
php artisan doctrine-entities:generate
First Use Case Use the generated entity in a repository or service:
use App\Entities\User;
$user = new User();
$user->name = 'John Doe';
$user->save(); // Uses Doctrine ORM under the hood
Model-Entity Mapping
// Eloquent model (API/database layer)
class User extends Model {}
// Doctrine entity (business logic layer)
class User extends \Dbstudios\DoctrineEntities\Entity {}
Repository Pattern
namespace App\Repositories;
use App\Entities\User;
use Dbstudios\DoctrineEntities\Repository;
class UserRepository extends Repository
{
public function findByName($name)
{
return $this->findOneBy(['name' => $name]);
}
}
Service Layer Abstraction
namespace App\Services;
use App\Entities\User;
use App\Repositories\UserRepository;
class UserService
{
protected $repository;
public function __construct(UserRepository $repository)
{
$this->repository = $repository;
}
public function createUser(array $data)
{
$user = new User();
$user->fromArray($data); // Hydrate entity
$this->repository->save($user);
return $user;
}
}
Event Listeners
namespace App\Entities;
use Doctrine\Common\Annotations\PrePersist;
class User extends \Dbstudios\DoctrineEntities\Entity
{
/**
* @PrePersist
*/
public function setCreatedAt()
{
$this->created_at = now();
}
}
Outdated Doctrine Version
Entity Generation Overwrites
doctrine-entities:generate will overwrite existing entity files.doctrine-entities:generate --force sparingly; prefer manual edits for critical logic.No Built-in Migration Support
Circular Dependencies
User has Post and Post has User), ensure proper lazy-loading:
// In User.php
public function getPosts()
{
return $this->hasMany(Post::class);
}
Enable Doctrine Logging
Add to config/doctrine-entities.php:
'logging' => true,
Logs will appear in storage/logs/doctrine.log.
Check Entity Metadata Dump metadata to debug mappings:
use Doctrine\ORM\Mapping\ClassMetadata;
$metadata = $this->entityManager->getClassMetadata(User::class);
dump($metadata->getFieldNames());
Transaction Handling Wrap operations in transactions to avoid partial saves:
$entityManager->beginTransaction();
try {
$user->save();
$entityManager->commit();
} catch (\Exception $e) {
$entityManager->rollBack();
throw $e;
}
Custom Hydration
Override fromArray() in entities to handle custom data mapping:
public function fromArray(array $data)
{
$this->name = $data['full_name'] ?? $data['name'];
$this->email = $data['email_address'];
}
Event Subscribers
Attach Doctrine events globally in AppServiceProvider:
public function boot()
{
$this->app->make('doctrine')->getEventManager()->addEventSubscriber(
new \App\Doctrine\EventSubscribers\AuditSubscriber()
);
}
Custom Entity Manager
Bind a custom Doctrine EntityManager in AppServiceProvider:
$this->app->singleton('doctrine', function () {
$config = $this->app['config']['doctrine-entities'];
return \Doctrine\ORM\EntityManager::create($config['connection'], $config['metadata']);
});
How can I help you explore Laravel packages today?