为什么 composer autoload 在 macOS Docker 容器上不起作用?

Why does composer autoload not work on macOS Docker containers?

文件结构如下:

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

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

这是因为您在 lib 文件夹上设置了命名空间书。您可以通过添加

将自动加载器直接指向 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 以便重建命名空间。

希望对您有所帮助。