我之前有一个非常简单的自动加载脚本,但是我注意到Doctrine2正在使用Composer,我认为简化一切可能会很好。不幸的是,Composer似乎没有像我理解的那样工作。
这是我的composer.json
的相关部分"autoload": {
"psr-0": {
"": "models/",
"Catalog2\\Config": "class/"
}
}
请注意,Doctrine2使用的"": "models/"
行一直运行正常。运行composer update
后,我的vendor / composer / autoload_namespaces.php的底部看起来像这样:
'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib'),
'Catalog2\\Config' => array($baseDir . '/class'),
'' => array($baseDir . '/models'),
我认为到目前为止一切顺利。在我的routes.php
文件(基本上是前端控制器)中,我有以下内容:
<?php
use Catalog2\Config;
//autoload classes
require_once __DIR__.'/vendor/autoload.php';
try {
$router = new Router;
} catch(Exception $e ) {
echo "<strong>Can't create router object</strong><br/>";
}
这里的Catalog2 \ Config \ Router应该调用我的class / Router.php,其开头如下:
<?php
namespace Catalog2\Config;
class Router {
protected $resource; //what are we manipulating? A product? An order?
protected $action; //what are we doing with that resource?
当我进入页面时,我得到了这个:
Fatal error: Class 'Router' not found in /home/tom/Code/productCatalog2/routes.php on line 14
这里出了什么问题?我再说一遍,Doctrine2能够从/ models自动加载我的模型代码,为什么我的更改不起作用呢?
答案 0 :(得分:2)
根据PSR-0
,名称空间前缀将包含在中。
因此,您班级的完整文件名必须是:
class/Catalog2/Config/Router.php
同时PSR-4
的行为与您预期的一样:它只会匹配名称空间前缀,并且不会将其附加到给定路径。
参考文献:
PS:您可能希望名称空间前缀为"Catalog2\\Config\\"
(请参阅尾部斜杠)