我正试图将第三方身份验证库注入到我的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');