Phalcon自动加载器找不到类


Class not found by Phalcon autoloader

我正试图将第三方身份验证库注入到我的Phalcon应用程序中。该文件存在于/lib/Foo_Bar_AuthProvider.php:

<?php
namespace Foo'Bar;
class AuthProvider
{
    public function authenticate()
    {
        return true;
    }
}

我在位于/public/index.php的引导程序中用Phalcon自动加载器注册了这个目录,并将其添加到DI:

<?php
try {
    //Register an autoloader
    $loader = new 'Phalcon'Loader();
    $loader->registerDirs(array(
        '../app/controllers/',
        '../app/models/',
        '../lib/'
    ))->register();
    //Create a DI
    $di = new 'Phalcon'DI'FactoryDefault();
    $di->set('authProvider', function() {
        return new 'Foo'Bar'AuthProvider();
    });
    // ...
}

然后我尝试在/app/controllers/AccountController.php中使用这个组件:

<?php
class AccountController extends 'Phalcon'Mvc'Controller
{
    public function loginAction()
    {
        if (!$this->request->isPost()) {
            return;
        }
        $success = $this->authProvider->authenticate();
        if (!$success) {
            $this->flash->error('Authentication failed.');
            return;
        }
        $this->flash->success('Authentication succeeded. Welcome!');
        return $this->dispatcher->forward(array('controller' => 'index', 'action' => 'index'));
    }
}

这引发了一个异常:

Fatal error: Class 'Foo'Bar'AuthProvider' not found in /public/index.php on line 44

我对使用PHP名称空间还很陌生,所以我可能遗漏了一些显而易见的东西,但我一直没能弄清楚。我尝试在Foo_Bar_AuthProvider.php中的命名空间声明之前添加一个反斜杠,如下所示:

namespace 'Foo'Bar;

这并没有改变任何事情。我还试着从引导程序中删除这个反斜杠:

$di->set('authProvider', function() {
    return new Foo'Bar'AuthProvider();
});

这里也没有骰子。最后,我尝试将use语句添加到AccountController.php中:

use 'Foo'Bar;

还有:

use Foo'Bar;

我相信自动加载器的目的是避免这样的事情,但添加use语句无论如何都不起作用。

了解PSR-0标准。Phalcon应用了他们的大多数约定以及其他PHP框架。

根据我的理解,_仅在类名中有意义,其他地方的下划线都是文字。例如

类名Foo_Bar_AuthProvider表示:在每个注册的目录中搜索Foo/Bar路径,然后检查AuthProvider.php文件。AFAIK,如果您需要文件位于Foo/Bar路径下,但不一定位于Foo/Bar命名空间中,那么这很有用。

我建议您使用PSR-0描述的"namespace=path"方法。尝试将Foo_Bar_AuthProvider.php重命名为AuthProvider.php,然后将此文件放入/lib/Foo/Bar。完成后,您将能够像这样注册这个库:

$di->set('authProvider', 'Foo'Bar'AuthProvider');