как инициализировать мое соединение ldap как соединение доктрины в файле bootstrap.php в zend-framework - PullRequest
0 голосов
/ 08 октября 2010

Я хочу использовать свой сервер LDAP в качестве БД. затем я создам классы персистентности в каталоге моделей, который будет расширен до Zend_Ldap, чтобы мне не пришлось писать все операции CRUD, но как я могу инициализировать соединение ldap в файле bootstrap.php
например, подключение к базе данных с использованием доктрины может быть инициализировано следующим образом, я хочу сделать то же самое для подключения 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;
}

но теперь я хочу сделать что-нибудь подобное (ниже) в папке моделей

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 и получить к нему доступ в моделях, чтобы это было возможно

1 Ответ

1 голос
/ 08 октября 2010

Вы можете сделать

protected function _initLdap() 
{
    $ldap = new Zend_Ldap(/*... your configuration ...*/);
    return $ldap;
}

Но такого понятия, как по умолчанию LDAP-соединение, не существует, поэтому вам нужно извлечь объект LDAP-соединения из ресурсов вашего загрузчика. Какой-то вспомогательный класс может, ну, в общем, помочь.

Кстати, ваша модель не должна расширяться Zend_Ldap - по крайней мере, не по той причине, по которой вы хотите это сделать. Вы могли бы, например, extends Zend_Ldap_Node, представляющий одну запись LDAP, тогда как Zend_Ldap - представление соединения LDAP и сервера LDAP, с которым вы разговариваете.

EDIT:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...