【问题标题】:How do I get my composer package autoloaded properly?如何正确自动加载我的作曲家包?
【发布时间】:2018-04-02 03:46:19
【问题描述】:

我创建了一个包来将业务逻辑分离成更易于分发的模块。作曲家文件如下所示:

{
    "name": "aggiq/johnny-cash",
    "description": "A collection of controllers, models, migrations, and tests for a phonebanking backend.",
    "license": "MIT",
    "authors": [ ... ],
    "require": {
        "illuminate/database": ">=5.5"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4"
    },
    "autoload": {
        "psr-4": {
            "Johnny\\Phonebanking\\": "src/"
        }
    }
}

而且我们的源文件确实在 src/:

src/Controllers/PhonebankController.php src/Models/Phonebank.php ...

我保存并将其推送到我们的 gitlab 存储库,然后将其作为依赖项包含在测试项目中:

{
    ...,
    "repositories": [{
        "type": "package",
        "package": {
            "name": "aggiq/johnny-cash",
            "version": "0.1",
            "type": "package",
            "source": {
                "url": "gitlab url",
                "type": "git",
                "reference": "dev"
            }
        }
    }],
    "require": {
        "aggiq/johnny-cash": "*",
    },
    ...
}

当我更新作曲家时,它会成功抓取项目并将其下载到供应商文件夹中:

vendor/aggiq/johnny-cash/Controllers/PhonebankController.php
...

但是,当我查看测试项目的 autoload_psr4.php 时,它并不存在。有没有我遗漏的步骤?

编辑:将目录更新为大写字母以匹配命名空间,这是生成的 PSR4 php 文件:

<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
);

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

    您已经在您的包的composer.json 正确注册了自动加载:

    "autoload": {
       "psr-4": {
           "Johnny\\Phonebanking\\": "src/"
       }
    }
    

    这意味着,Johnny\Phonebanking 命名空间中的任何类都将位于src 目录中。例如:

    • Johnny\Phonebanking\SomeClass => src/SomeClass.php
    • Johnny\Phonebanking\SomeNamespace\AnotherClass => src/SomeNamespace\AnotherClass.php

    如您所见,必须尊重大写字母


    也就是说,您应该更正目录的首字母,来自:

    src/controllers/PhonebankController.php
    src/models/Phonebank.php
    

    src/Controllers/PhonebankController.php
    src/Models/Phonebank.php
    

    【讨论】:

    • 我已按照您的建议将目录重命名为 src/Controllerssrc/Models 等,并将项目重新导入到我的基础项目中。我可以确认vendor/ 文件夹中的目录。但是运行 composer updatecomposer dump-autoload 不会将类添加到 psr4 自动加载文件中。对不起!
    • 只有前缀和它们的位置应该在autoload_psr4.php,而不是特定的文件。如果那里缺少"Johnny\\Phonebanking\\",请将文件内容添加到您的问题中。
    • 您能暂时允许访问该软件包吗?我想测试一下。另外,您的问题真的是空的autoload_psr4.php 还是没有自动加载类?您是否在代码中尝试过它们?我问是因为它可能不相关,因为作曲家有很多(优化的)加载内容的方式。
    【解决方案2】:

    我已经解决了。我们需要做两件事。

    1. 父包中指定的存储库类型应该是vcs而不是package,因为我们是从一个git服务器加载的:

      “存储库”:[{ “类型”:“vcs”, “网址”:“git@xxx.git” }]

    2. 子包中的包类型应该是library:

      “类型”:“库”

    完成这两项更改后,composer update 不仅安装了子包,还安装了它的依赖项,证明它正在被 composer 识别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2013-12-09
      • 2014-07-04
      • 1970-01-01
      • 2018-08-26
      • 2013-03-05
      相关资源
      最近更新 更多