部署后 Composer 自动加载将不起作用

Composer autoload won't work after deployment

我对使用 composer 和 autoload 来组织我的代码还比较陌生。我有一个 git 存储库,在我的本地机器上,我在项目的根目录中设置了作曲家。我在 composer.json 中指定了获得 运行ning 所需的所有内容。使用“composer install”,所有库都会自动安装。

{
    "name": "my/repo",
    "description": "bla",
    "version": "1.2.3",
    "require":
    {
        "php": "5.6.*",
        "geraintluff/jsv4": "1.*",
        "lcobucci/jwt": "^3.0"
    },
    "autoload":
    {
        "psr-4":
        {
            "MyNamespace\": "src/"
        }
    }
}

所以 - 一旦我在我的本地机器上 运行 “composer install”,所有内容都会自动加载到我的代码中。很好。

但现在我需要将整个东西部署到另一个 linux 系统上。所以我从 git 和 运行 composer install 中提取。获取所有库并且自动加载文件显示在 vendor/

然而,我无法使用自动加载(是的,我使用了 require_once(__DIR__ . '/../vendor/autoload.php');)。每次我尝试实例化一个 class,我都会得到一个

PHP Fatal error:  Class 'X' not found in /var/www/bla/x.class.php on line 123

使用 use X; 无法解决问题,尝试使用其完整命名空间名称(例如 $x = new \A\B\X();)实例化 class 也无法解决问题

这是文件夹结构(如果重要的话):

+ src/
| + X.class.php // namespace here is "MyNamespace"
| + Y.class.php // same namespace
+ test/
  + run.php // namespace is "Test"

这是这段代码的片段 (run.php):

<?php namespace Test; // different namespace than the rest of the code
// making the namespace also "\MyNamespace" wouldnt work either

require_once(__DIR__ . '/../vendor/autoload.php');

use \MyNamespace\Y; // whether this line is here or not does not change the error

session_start();

// same error as with "just" implements Y {}
class SomeClass implements \MyNamespace\Y {
    // ...
}

?>

所以在这里,对于扩展Y的行抛出了致命错误。不管我是否使用完整的命名空间。唯一有用的是 require_once()...

所以,这迫使我回到自己做所有 require/includes 的繁琐方式!?有什么办法可以解决吗?

PS: composer dumpautoload 无济于事

PPS: composer validate 没有显示错误

为了符合 PSR-4,您的文件结构应该是:

+ src/
| + X.php
| + Y.php

注意删除了 .class.php 后缀。 http://www.php-fig.org/psr/psr-4/