【问题标题】:Why do I have to run Composer dump after installing my package?为什么我必须在安装我的包后运行 Composer 转储?
【发布时间】:2016-03-27 21:49:48
【问题描述】:

我在 packagist 上创建了一个简单的学习包(tommytest/tommytest)。它安装得很好,但我必须在安装后立即运行“composer dump-autoload -o”。在手动运行转储自动加载之前,我得到了这个:

致命错误:第 5 行的 C:\xampp\htdocs\simple\index.php 中找不到类 'mysqlgridspace\Page'

手动运行 dump-autoload 后它工作正常。安装包时不应该自动处理自动加载设置吗?

这是我的 composer.json(位于:simple/vendor/tommytest/tommytest/composer.json

 {
  "name": "tommytest/tommytest",
  "type": "library",
  "description": "Framework agnostic data grid",
  "keywords": ["datagrid","data grid"],
  "homepage": "https://github.com/escalibore/tommytest",
  "license": "MIT",
  "authors": [
    {
      "name": "Tommy Bert",
      "email": "tom@tberthold.com",
      "homepage": "http://tberthold.com",
      "role": "Developer"
    }
  ],
  "require": {
    "php": ">=5.3.0"
  },
  "autoload": {
    "psr-4": {
      "mysqlgridspace\\":"src/"
    }
  }
}

还有我的类文件(位于:simple/vendor/tommytest/tommytest/src/Mysqlgridmain.class.php

<?php
namespace mysqlgridspace;

class Page {
    public function __construct()
    {
        echo "hello, i am a page.<br>";
    }
}

class Book {
    public function __construct()
    {
    echo "hello, i am a book.<br>";
    }
}

【问题讨论】:

    标签: php composer-php autoloader packagist


    【解决方案1】:

    我找到了解决问题的方法。我将 "files": ["src/Mysqlgridmain.class.php"], 添加到我的 composer.json 中的自动加载详细信息中

    所以它来自:

    "autoload": {
       "psr-4": {
         "mysqlgridspace\\":"src/"
    }
    

    到:

    "autoload": {
      "files": ["src/Mysqlgridmain.class.php"],
      "psr-4": {
        "mysqlgridspace\\":"src/"
    } 
    

    我不知道为什么 psr-4 标签不这样做,但我认为这是一个可以接受的解决方法。

    【讨论】:

    • 可能是因为 .class.php 扩展名,Composers 类扫描器无法识别它。您可以将文件从 Mysqlgridmain.class.php 重命名为 MysqlGridMain.php 并重试。
    【解决方案2】:

    这些类不能使用 Composer 的 PSR-4 自动加载器自动加载,因为它将类名 mysqlgridspace\Page 解析为名为 Page.php 的文件,该文件应该存在于 src 中 - 但它不存在。

    首先,每个文件中应该只声明一个类。

    你应该有

    src/
        Book.php
        Page.php
    

    每个只声明一个类。

    那么您的 PSR-4 自动加载应该可以工作了。

    有关参考,请参阅http://www.php-fig.org/psr/psr-4/

    【讨论】:

    • 感谢@localheinz,将每个类放在它自己的同名文件中,这让我更好地理解了 psr-4 自动加载的工作原理。感谢您解开谜团!
    猜你喜欢
    • 2019-05-20
    • 2019-04-04
    • 1970-01-01
    • 2019-04-17
    • 2018-08-18
    • 1970-01-01
    • 2015-08-01
    • 2016-03-02
    • 2016-06-30
    相关资源
    最近更新 更多