Installation
composer require carnegielearning/ldap-orm-bundle
Add to AppKernel.php:
new CarnegieLearning\LdapOrmBundle\CarnegieLearningLdapOrmBundle(),
Configure LDAP Connection
Add to config.yml:
carnegie_ldap_orm:
connections:
default:
host: 'ldap.example.com'
port: 389
use_ssl: false
username: 'cn=admin,dc=example,dc=com'
password: 'admin_password'
base_dn: 'dc=example,dc=com'
First Use Case: Querying Users
Define an entity extending LdapEntity (e.g., User):
namespace App\Entity;
use CarnegieLearning\LdapOrmBundle\Entity\LdapEntity;
class User extends LdapEntity
{
protected $objectClass = 'inetOrgPerson';
}
Query in a controller/service:
$users = $this->get('carnegie_ldap_orm.manager')->getRepository('App\Entity\User')->findAll();
Entity Mapping
Extend LdapEntity for each LDAP object class (e.g., Group, OrganizationalUnit):
class Group extends LdapEntity
{
protected $objectClass = 'groupOfNames';
protected $fields = ['cn', 'member'];
}
Repository Operations
Use Repository::findBy() with LDAP attributes:
$repo = $this->get('carnegie_ldap_orm.manager')->getRepository('App\Entity\User');
$users = $repo->findBy(['cn' => 'John Doe']);
Complex Filtering
Leverage filterByComplex() for advanced queries:
$filter = $repo->filterByComplex()
->where('ou', '=', 'Users')
->andWhere('objectClass', '=', 'inetOrgPerson')
->getFilter();
$results = $repo->findByCustomFilter($filter);
CRUD Operations
create() and save():
$user = new User();
$user->setDn('cn=New User,ou=Users');
$user->setCn('New User');
$manager->save($user);
save().remove():
$manager->remove($user);
Bulk Operations
Iterate over results with findAll() or findBy():
foreach ($users as $user) {
$user->setMail($user->getMail() . '@newdomain.com');
$manager->save($user);
}
Symfony\Component\Form\Extension\Core\Type\FormType.UserProviderInterface).$cache = $this->get('cache.app');
$key = 'ldap_users_' . md5('ou=Users');
$users = $cache->get($key, function() use ($repo) {
return $repo->findBy(['ou' => 'Users']);
});
Connection Issues
ldapsearch to test manually:
ldapsearch -x -H ldap://ldap.example.com -D "cn=admin,dc=example,dc=com" -w admin_password -b "dc=example,dc=com"
Attribute Mapping
null or incorrect values.$fields in your entity matches LDAP attributes (case-sensitive). Use getLdapAttributes() to debug:
$user = $repo->findOneBy(['cn' => 'Test']);
var_dump($user->getLdapAttributes());
Object Class Conflicts
$objectClass in your entity. For example, inetOrgPerson requires top, person, and organizationalPerson.Performance with Large Datasets
findBy() with specific filters instead of findAll(). Paginate results:
$paginator = $this->get('knp_paginator');
$results = $paginator->paginate(
$repo->findBy(['ou' => 'Users']),
$pageNumber,
50
);
Schema Differences
getLdapConnection()->getSchemaManager() to inspect available object classes and attributes.Enable LDAP Debugging Configure the connection to log queries:
carnegie_ldap_orm:
connections:
default:
debug: true
Check logs for raw LDAP queries.
Use var_dump() or dd()
Inspect entities and attributes:
dd($user->getLdapAttributes());
Test with Simple Queries
Start with basic findOneBy() calls before complex filters.
Custom Filters
Extend Repository::filterByComplex() for reusable logic:
class UserRepository extends \CarnegieLearning\LdapOrmBundle\Repository\Repository
{
public function findActiveUsers()
{
$filter = $this->filterByComplex()
->where('objectClass', '=', 'inetOrgPerson')
->andWhere('mail', '!=', null)
->getFilter();
return $this->findByCustomFilter($filter);
}
}
Event Listeners
Hook into LDAP operations via Symfony events (e.g., ldap.pre_save):
$eventDispatcher->addListener('ldap.pre_save', function(LdapEvent $event) {
if ($event->getEntity() instanceof User) {
$event->getEntity()->setModifiedAt(new \DateTime());
}
});
Custom Entity Managers Override the default manager to add logic:
class CustomLdapManager extends \CarnegieLearning\LdapOrmBundle\Manager\Manager
{
public function findByDn($dn)
{
return $this->findOneBy(['dn' => $dn]);
}
}
Register as a service in services.yml:
services:
carnegie_ldap_orm.manager.custom:
class: App\Manager\CustomLdapManager
arguments: ['@carnegie_ldap_orm.connection.default']
Post-Processing
Use LdapEntity::postLoad() to transform data:
class User extends LdapEntity
{
public function postLoad()
{
$this->fullName = $this->getGivenName() . ' ' . $this->getSn();
}
}
How can I help you explore Laravel packages today?