Installation:
composer require cisco-systems/directory-bundle:dev-master
Add to AppKernel.php:
new CiscoSystems\DirectoryBundle\CiscoSystemsDirectoryBundle(),
Basic Configuration (config.yml):
cisco_systems_directory:
default_directory: main
directories:
main:
servers:
primary:
host: ads1.example.com
First Use Case:
Inject the DirectoryManager service to query AD:
use CiscoSystems\DirectoryBundle\Manager\DirectoryManager;
class MyController extends Controller
{
public function __construct(DirectoryManager $directoryManager)
{
$this->directoryManager = $directoryManager;
}
public function searchUsers()
{
$users = $this->directoryManager->getDirectory('main')->search('(objectClass=user)');
return $this->render('users.html.twig', ['users' => $users]);
}
}
Directory Configuration:
directories.<name>.servers.default_directory to set a fallback.default_rdn/default_password.Querying AD:
DirectoryManager to fetch a directory instance:
$directory = $this->directoryManager->getDirectory('main');
$results = $directory->search('(sn=Doe)');
$entry = $directory->findEntry('uid=jdoe');
Custom Repositories:
CiscoSystems\DirectoryBundle\Repository\DirectoryRepository for domain-specific logic.repository in config:
directories:
main:
repository: 'AppBundle\Repository\CustomDirectoryRepository'
Service Integration:
DirectoryManager to controllers/services for reusable AD access.$user = $directory->findEntry('uid=' . $username);
if ($user && $directory->bind($user->getDn(), $password)) {
// Authenticated
}
Caching:
$cache = $this->get('cache.app');
$key = 'ad_users_' . md5($searchFilter);
$users = $cache->get($key, function() use ($directory, $searchFilter) {
return $directory->search($searchFilter);
});
Deprecated Package:
LDAP Extension:
php-ldap is installed and enabled (php -m | grep ldap).ldap in php.ini:
extension=ldap
ldap.max_links = -1
Configuration Overrides:
%myAppsLdapUsername% must be defined in parameters.yml or resolved via dependency injection.Connection Failures:
CiscoSystems\DirectoryBundle\Exception\DirectoryException for network/AD issues:
try {
$directory->search('...');
} catch (DirectoryException $e) {
$this->addFlash('error', 'AD unavailable: ' . $e->getMessage());
}
Performance:
(objectClass=user)).->setLimit(100).Enable LDAP Logging:
Add to php.ini:
ldap.trace_level = 32767
Check logs for connection/query details.
Test Connections: Use a standalone script to validate AD access:
$ldap = ldap_connect('ads1.example.com');
ldap_bind($ldap, 'username', 'password');
Common Errors:
host, firewall rules, and AD server status.default_rdn/default_password in config.uid=jdoe,ou=users,dc=example,dc=com).Custom Entries:
Extend CiscoSystems\DirectoryBundle\Model\EntryInterface for project-specific attributes.
Event Listeners:
Subscribe to directory.search events (if the bundle supports them) to log/transform results:
services:
app.ad_listener:
class: AppBundle\EventListener\DirectoryListener
tags:
- { name: kernel.event_listener, event: directory.search, method: onSearch }
Fallback Servers:
Implement retry logic for secondary servers in config:
if (!$primary->search($filter)) {
$secondary->search($filter);
}
Symfony Forms:
Use the bundle with Symfony\Component\Form\Extension\Core\Type\ChoiceType for AD-based dropdowns:
$users = $directory->search('(objectClass=user)');
$userChoices = array_map(function($entry) {
return $entry->getAttribute('cn');
}, $users);
How can I help you explore Laravel packages today?