PHP使用命名空间自动加载Composer

时间:2014-03-24 22:51:32

标签: php composer-php autoload autoloader

我之前有一个非常简单的自动加载脚本,但是我注意到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自动加载我的模型代码,为什么我的更改不起作用呢?

1 个答案:

答案 0 :(得分:2)

根据PSR-0,名称空间前缀将包含在中。

因此,您班级的完整文件名必须是:

class/Catalog2/Config/Router.php

同时PSR-4的行为与您预期的一样:它只会匹配名称空间前缀,并且不会将其附加到给定路径。

参考文献:

PS:您可能希望名称空间前缀为"Catalog2\\Config\\"(请参阅尾部斜杠)