Phalcon自动加载器找不到的类

时间:2014-04-14 22:21:59

标签: php dependency-injection namespaces autoload phalcon

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

<?php

namespace Foo\Bar;

class AuthProvider
{
    public function authenticate()
    {
        return true;
    }
}

我在我的引导程序中将Phalcon自动加载器注册到/public/index.php,并将其添加到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语句无论如何都不起作用。

1 个答案:

答案 0 :(得分:2)

了解PSR-0 standard。 Phalcon也应用了大多数约定和其他PHP框架。

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

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

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

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