如何像zend framework中bootstrap.php文件中的条令连接一样初始化ldap连接

如何像zend framework中bootstrap.php文件中的条令连接一样初始化ldap连接,php,debugging,zend-framework,doctrine,Php,Debugging,Zend Framework,Doctrine,我想将ldap服务器用作数据库。然后,我将在models目录中创建持久性类,该类将扩展到Zend_Ldap,这样我就不必编写所有CRUD操作,但如何在bootstrap.php文件中初始化Ldap连接 例如,使用条令的数据库连接可以这样初始化,我想对ldap连接也这样做 protected function _initDoctrine() { $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->

我想将ldap服务器用作数据库。然后,我将在models目录中创建持久性类,该类将扩展到Zend_Ldap,这样我就不必编写所有CRUD操作,但如何在bootstrap.php文件中初始化Ldap连接
例如,使用条令的数据库连接可以这样初始化,我想对ldap连接也这样做

protected function _initDoctrine()
 {
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('Doctrine');
    $this->getApplication()->getAutoloader()
        ->pushAutoloader(array('Doctrine', 'autoload'));
    spl_autoload_register(array('Doctrine', 'modelsAutoload'));

    $manager = Doctrine_Manager::getInstance();
    $doctrineConfig = $this->getOption('doctrine');
    $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
    $manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);

    Doctrine_Core::loadModels($doctrineConfig['models_path']);

    $conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine');
    $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true);
 return $conn;
}
但是现在我想做的是,如果我在models文件夹中有类似的东西(如下所示)

class Application_Model_entry extends Zend_Ldap_Node_collection {

public static function getInstance() {
    $options = Zend_Registry::get('config')->ldap;//i want to avoid this line
    $ldap = new Zend_Ldap($options); // i want to avoid this line
    $dn = $ldap->getBaseDn(); // i want to avoid this line

    $a = new Zend_Ldap_Node_Collection(new Zend_Ldap_Collection_Iterator_Default($ldap,'email')); //also this one 
    return $a;//where $a is an instance of an LDAP entry(node)

}
然后在控制器中,我想做一些事情,比如db

$ent = new Application_Model_entry();
$ent->email = "xyz@abc.xom";
...
$ent->save();
$ent->update();
我如何初始化ldap连接并在模型中访问它,以便实现这一点

protected function _initLdap() 
{
    $ldap = new Zend_Ldap(/*... your configuration ...*/);
    return $ldap;
}
但是没有默认的LDAP连接,因此您必须从引导程序的资源中检索LDAP连接对象。一些助手类可能会有所帮助

顺便说一下,您的模型不应该扩展
Zend_Ldap
——至少不是因为您希望这样做的原因。例如,您可以扩展
Zend_Ldap_节点
,它是单个Ldap条目的表示,而
Zend_Ldap
则是Ldap连接和您正在交谈的Ldap服务器的表示

编辑:

class Application_Ldap
{
    public static function getLdap()
    {
        /* return LDAP connection from bootstrap */
    }

    public static function newEntry($name) 
    {
        $dn   = $name; // build DN from given entity name
        $node = Zend_Ldap_Node::create($dn);
        $node->attachLdap(self::getLdap());
        return $node;
    }

    public static function loadEntry($name)
    {
        $dn   = $name; // build DN from given entity name
        $node = Zend_Ldap_Node::fromLdap($dn, self::getLdap());
        return $node
    }
}
请注意:这并不是一个真正的最先进的模型,只是一个简单的解决方案(如果我理解正确的话)。它允许您在应用程序逻辑中执行以下操作:

$newOne = Application_Ldap::newEntry('new-one');
$newOne->email = "xyz@abc.xom";
$newOne->update();

$oldOne = Application_Ldap::loadEntry('old-one');
$oldOne->email = "abc@abc.xom";
$oldOne->update();

我已经试过了。但是你能解释一下你的答案吗?当你说“但是没有默认的LDAP连接这样的东西,所以你必须从引导程序的资源中检索LDAP连接对象。一些帮助程序类可能会有帮助……”b/se我希望通过将上面提到的行移动到bootstrap.php文件来避免这些行,正如您所指出的。即使我已经将该行移到bootstrap.php文件中,我如何才能以与doctrine相同的方式访问连接异议。。在我所指的@Stefan GehrigWhat模型中,没有默认的LDAP连接,而Doctrine维护静态全局引用(使用单例)默认数据库连接,并在生成的模型中使用此引用,以允许与数据库交互,而无需每次指定不同的连接,
Zend_Ldap
本身没有这样的概念。它不是为基于LDAP的数据设计的某种对象关系映射器、表网关或行网关。它可以与Zend_Db的核心功能相比较:为。。。。。。数据库连接。我将扩展我的答案,以展示一种可能的方法。阅读您的编辑,我想您应该仔细看看
Zend_Ldap
Zend_Ldap_节点
Zend_Ldap_节点集合
代表了什么。你把这些实体混在一起了。