gpt4 book ai didi

php - ZF2 ldap分页

转载 作者:可可西里 更新时间:2023-11-01 01:03:31 26 4
gpt4 key购买 nike

我在使用 LDAP 库和 Active Directory 时遇到了一些问题。由于 AD 的限制,如果参数将返回超过 1000 个结果,我将无法使用 LDAP 库进行搜索。此外,似乎没有办法使用 ZF2 LDAP 库对结果进行分页。我知道如何分页,但我宁愿使用 ZF2 内置 方法(如果存在的话)。

我是否遗漏了什么,或者我是否必须创建自己的方法来实现这一点?

附言我查看了手册和代码,但看不到任何实现此目的的方法。

最佳答案

这就是我为解决这个问题所做的

/**
* An LDAP search routine for finding information and returning paginated results
*
* Options can be either passed as single parameters according to the
* method signature or as an array with one or more of the following keys
* - filter
* - baseDn
* - scope
* - attributes
* - sort
* - collectionClass
* - sizelimit
* - timelimit
*
* @param string|Filter\AbstractFilter|array $filter
* @param string|Dn|null $basedn
* @param array $attributes
* @param string|null $sort
* @param string|null $collectionClass
* @param integer $timelimit
* @param integer $pageSize
* @return Array
* @throws Exception\LdapException
*/
public function multiPageSearch(
$filter, $basedn = null, array $attributes = array(), $sort = null,
$collectionClass = null, $timelimit = 0, $pageSize = 1000
)
{
if (is_array($filter)) {
$options = array_change_key_case($filter, CASE_LOWER);
foreach ($options as $key => $value) {
switch ($key) {
case 'filter':
case 'basedn':
case 'scope':
case 'sort':
$$key = $value;
break;
case 'attributes':
if (is_array($value)) {
$attributes = $value;
}
break;
case 'collectionclass':
$collectionClass = $value;
break;
case 'sizelimit':
case 'timelimit':
$$key = (int) $value;
break;
}
}
}

if ($basedn === null) {
$basedn = $this->getBaseDn();
} elseif ($basedn instanceof Dn) {
$basedn = $basedn->toString();
}

if ($filter instanceof Filter\AbstractFilter) {
$filter = $filter->toString();
}

$resource = $this->getResource();

$results = new \ArrayIterator;

Stdlib\ErrorHandler::start(E_WARNING);
$cookie = '';
do {
ldap_control_paged_result($resource, $pageSize, true, $cookie);

$result = ldap_search($resource, $basedn, $filter, $attributes, 0, $pageSize, $timelimit);

if ($sort !== null && is_string($sort)) {
$isSorted = ldap_sort($resource, $result, $sort);

if ($isSorted === false) {
throw new Exception\LdapException($this, 'sorting: ' . $sort);
}
}

$entries = new \ArrayIterator(ldap_get_entries($resource, $result));

foreach ($entries as $e) {
$results[] = $e;
}

ldap_control_paged_result_response($resource, $result, $cookie);
} while($cookie !== null && $cookie != '');
Stdlib\ErrorHandler::stop();

if ($results->count() == 0) {
throw new Exception\LdapException($this, 'searching: ' . $filter);
}

return $results;
}

这个类/方法是为了扩展 Zend\Ldap\Ldap 类,它将允许返回超过 1000 个结果,但不会以与 Ldap::search 方法相同的格式返回它们。

关于php - ZF2 ldap分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com