【问题标题】:PHP Autoloading with Composer using Namespaces使用命名空间的 Composer 自动加载 PHP
【发布时间】:2014-05-02 13:34:54
【问题描述】:

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

【问题讨论】:

    标签: php composer-php autoload autoloader


    【解决方案1】:

    根据PSR-0,命名空间前缀将被包含到路径中。

    所以你的类的完整文件名必须是:

    class/Catalog2/Config/Router.php
    

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

    参考资料:

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

    【讨论】:

    • 你是救生员。我注意到当我尝试在 composer.json 中使用 psr-4 时,它为 psr-4 路径生成了一个单独的自动加载器。在同一个应用程序中使用这两种标准是否可能/最佳实践?
    • 可以,两个都定义就行了
    猜你喜欢
    • 2016-12-08
    • 2014-03-17
    • 1970-01-01
    • 2013-11-30
    • 2013-11-25
    • 2014-04-13
    • 2014-09-24
    • 2011-08-06
    相关资源
    最近更新 更多