vanilla php ldap 查询有效。 Symfony 3 ldap 查询失败。为什么?

vanilla php ldap query works. Symfony 3 ldap query fails. Why?

我正在尝试弄清楚如何在 Symfony3 中使用 Ldap class。我已经成功创建并绑定了一个连接,但我无法获得任何查询结果。为了确保查询确实有效,我 运行 一个裸 php 版本:

    if($lconn = ldap_connect('ds.mydomain.ca')){
        ldap_set_option($lconn, LDAP_OPT_REFERRALS, 0);
        ldap_set_option($lconn, LDAP_OPT_PROTOCOL_VERSION, 3);

        if($lbind = ldap_bind($lconn,'webuser','password')){
            $filter  ="(&(sn=Smith)(givenname=J*))";

            if(!$result = ldap_search($lconn, "dc=ds, dc=mydomain, dc=ca", $filter)) throw \Exception("Error in search query: ".ldap_error($lconn));
            $output = ldap_get_entries($lconn, $result);
        }else{
            $output='bind failed';
        }
    } else {
        $output= 'connection failed';
    }

它 returns 预期的结果数。

另一方面,此查询使用 Symfony 3 的 Ldap 组件完成 returns 0 个结果:

//use Symfony\Component\Ldap\Ldap

$ldap = Ldap::create('ext_ldap', array(
    'host' => 'ds.mydomain.ca',
    'version' => 3,
    'debug' => true,
    'referrals' => false,
));

$ldap->bind('webuser', 'password');
$q = $ldap->query("dc=ds, dc=nrc, dc=ca", "(&(sn=Smith)(givenname=J*))");
$output = $q->execute();

知道为什么当 Symfony ldap 查询的所有选项都应该与我用于裸 php 查询的选项相同时它会失败吗?

reposted this question on the Symfony github. @ChadSikorra也在场。他清楚地说明了我的问题是什么。这是他的解释:

If you look at the collection class, nothing is done with the result resource until initialize() is called in the class. If you do return array('output' => array('bare' => $bare, 'symfony' => $symf->toArray())); it will call initialize and you'll see the entries populated in the class. Unless there's something else going on.

您在使用最新的 3.1+ 版本时仍然遇到此问题吗?

抱歉,我不常去 Stack Overflow,大部分时间都花在 Github 上,所以我之前没有看到你的问题。

正如@ChadSikorra 所说,您应该使用结果集合的 toArray() 方法 class,或者您应该直接迭代结果。

实现是为了以内存高效的方式遍历结果,默认情况下不会将所有结果存储在数组中,但 toArray() 方法可以为您完成此操作。在幕后,它实际上使用适当的 PHP 函数 (iterator_to_array) 将生成的 itératif 转换为数组。

顺便说一句,迭代器和 toArray() 函数调用之间曾经存在一些不一致,但在最近的版本中已得到修复。

干杯!