尝试从命名空间 (...) 加载类“ClassName”。即使命名空间已导入

Mar*_*lka 3 php namespaces symfony

我有一个 Symfony 项目,我向其中添加了一些包含各种类的非 symfony php 文件。但由于某种原因,即使 IDE 正确地看到了这些类,加载网站时也不会加载这些类。

所以,我有一个类需要其他类:

namespace rootspace\FrontBundle\Controller;

use rootspace\FrontBundle\Networks\TwitterOAuth;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class TwitterController extends Controller
{
    public function connectAction(){
        // The TwitterOAuth instance
        $connection = new TwitterOAuth('abc', '123');
    }
}
Run Code Online (Sandbox Code Playgroud)

然后是无法加载的类(需要另一个文件)

namespace rootspace\FrontBundle\Networks;

/* Load OAuth lib. You can find it at http://oauth.net */
//require_once('OAuth.php'); -- should this be commented out?

/**
 * Twitter OAuth class
 */
class TwitterOAuth {
  /* Contains the last HTTP status code returned. */
}
Run Code Online (Sandbox Code Playgroud)

最后是第三个文件

namespace rootspace\FrontBundle\Networks;
use Symfony\Component\Config\Definition\Exception\Exception;

class OAuthConsumer
{
    public $key;
    public $secret;
}
(...)
Run Code Online (Sandbox Code Playgroud)

我认为实际的文件名并不重要,对吧?也不是它们的结构?PhpStorm 可以正确查看所有类,我可以右键单击它们,但部署时会失败。

感谢帮助

编辑 - 整个错误消息说

Attempted to load class "TwitterOAuth" from namespace "rootspace\FrontBundle\Networks" in D:\Dropbox\project\src\rootspace\FrontBundle\Controller\TwitterController.php line 15. Do you need to "use" it from another namespace?
Run Code Online (Sandbox Code Playgroud)

Tom*_*ski 6

这是因为 Symfony 的自动加载器遵循PSR标准(PSR-0PSR-4),该标准规定完全限定(带有命名空间)类名会转换为文件位置和名称。所以事实上文件名确实很重要。因此,在您的情况下,rootspace\FrontBundle\Networks\TwitterOAuth类应该位于rootspace/FrontBundle/Networks名为的文件的目录中TwitterOAuth.php

如果您使用的类不遵循标准,您也可以在文件PSR中手动注册它们app/autoloader.php

检查这些以获取更多信息:

如何向 Symfony 2.1 添加命名空间?:

如何自动加载类

并检查这个答案