【问题标题】:Why does composer autoload not work on macOS Docker containers?为什么作曲家自动加载在 macOS Docker 容器上不起作用?
【发布时间】:2019-07-11 22:09:42
【问题描述】:

文件结构如下:

index.php
composer.json
composer.lock
-lib
--books
---SearchClient.php (contains class books\SearchClient

以下 docker-compose.yml + PHP 适用于 Windows:

{
    "name"             : "keithdavis/books",
    "description"      : "",
    "version"          : "0.1",
    "minimum-stability": "beta",
    "require"          : {
        "ext-curl"         : "*",
        "ext-json"         : "*",
        "guzzlehttp/guzzle": "^6.3"
    },
    "autoload"         : {
        "psr-4": {
            "books\\": "lib"
        }
    }
}
<?php

use books\SearchClient;

require_once __DIR__."/vendor/autoload.php";
$oSearchClient = new SearchClient();

但是,在 macOS (Mojave) 上:

( ! ) Fatal error: Uncaught Error: Class 'books\SearchClient' not found in /var/www/html/search.php on line 6
( ! ) Error: Class 'books\SearchClient' not found in /var/www/html/search.php on line 6
Call Stack
#   Time    Memory  Function    Location
1   0.0032  416944  {main}( )   .../search.php:0

在调试中,路径“lib”似乎是问题所在,但我尝试了“/lib”,但也不起作用。我想也许我的 Composer 安装不正确。我是 Windows 上经验丰富的 PHP 开发人员,但对 Mac 来说相对较新,所以我不是 100% 认为在 Mac 上安装 Composer 的最佳方式。我在全球范围内遵循了这些说明:

https://getcomposer.org/doc/00-intro.md#globally

【问题讨论】:

  • 我不明白为什么这应该在 Windows 上工作,但您的自动加载配置似乎应该如下所示:books\\": "lib/books" 否则您的类必须在 books\books 命名空间中。跨度>

标签: macos docker-compose composer-php autoload


【解决方案1】:

查看您的文件结构,您搜索客户端类的命名空间需要是 namespace books\books;

这是因为您在 lib 文件夹中设置了命名空间 book。您可以通过添加将自动加载器直接指向 book 文件夹,而不是在命名空间中使用 book 两次

{
    "name"             : "keithdavis/books",
    "description"      : "",
    "version"          : "0.1",
    "minimum-stability": "beta",
    "require"          : {
        "ext-curl"         : "*",
        "ext-json"         : "*",
        "guzzlehttp/guzzle": "^6.3"
    },
    "autoload"         : {
        "psr-4": {
            "books\\": "lib/books"
        }
    }
}

确保在更改自动加载时运行 composer dumpautoload,以便重建命名空间。

希望这会有所帮助。

【讨论】:

  • 是的,两者都适用,但正如上面评论中提到的,奇怪的是它曾经在 Windows 中工作过。
猜你喜欢
  • 2014-01-31
  • 2013-02-07
  • 2016-10-20
  • 2016-08-01
  • 2015-12-24
  • 2015-09-24
  • 2017-12-28
  • 2017-12-28
  • 2013-03-05
相关资源
最近更新 更多