我是Symfony的新手,所以这可能是一个虚假的问题。但是,经过几个小时的谷歌我还没有找到任何相关的答案,这可能值得一试。
所以基本上我使用的是Windows,Apache,纯PHP,Mongodb以及' raw' PHP_Mongodb PECL驱动程序(这里使用的词' raw'与Symfony2中的Doctrine Mongodb ODM捆绑包不同)用于Web应用程序开发。 PECL驱动程序工作得很好,我可以写这样的东西:
<?php
$m = new Mongo();
$db = $m->myDB;
$db->find();
//Do Other DB Operations.
上述代码工作正常,没有任何&#39;使用&#39;&#39;包含&#39;或者&#39;要求&#39;自从我遵循标准指令并在php.ini中设置PECL驱动程序扩展以来的语句。在Web浏览器中显示phpinfo()时,Mongodb驱动程序信息会正确显示。一切都很完美。
然后我开始使用Symfony2,因为它提供了url重写,MVC模式,安全性和其他有用的东西。 Doctrine Mongodb ODM捆绑包很好用,除了在我看来,它只能持久化PHP对象。我的项目中确实有一堆javascript对象要坚持,除了放一个PHP包装器之外别无他法。在它上面(创建一个只包含该javascript对象的PHP对象)。
当我尝试使用旧的PECL技巧与上面的相同代码块与数据库通信时,我收到了这个错误:
Fatal error: Class 'MyProject\Controller\Mongo' not found in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\Symfony\src\MyProject\Controller\DefaultController.php on line 47.
似乎Symfony2阻止或覆盖了php.ini中的扩展路径,同时只查找其自动类加载器。我想我需要更改autoload.php和/或AppKernel.php以包含该扩展名吗?请帮助我了解这里发生了什么。我可以在Symfony2中使用PECL驱动程序吗?或者是Doctrine Mongodb ODM 在Symfony2中访问数据库的唯一途径?谢谢!
答案 0 :(得分:1)
Symfony2适用于命名空间php。这使得使用非命名空间库/类有点棘手,但你真的需要知道这些技巧。
当您尝试使用new Mongo()
来获取mongodb对象时,PHP会查找当前的命名空间,这意味着它会在您的类中查找mongo()函数。要使其工作,您需要为mongo指定名称空间。由于它不使用名称空间,因此PHP将其放在全局名称空间中。因此,要正确引用该函数,您需要使用new \Mongo()
,PHP将查找您的\ namespace而不是当前的。{/ p>