我正在尝试将第三方身份验证库注入我的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语句无论如何都不起作用。
答案 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');