作曲家自动加载赢得';部署后无法工作


Composer autoload won't work after deployment

我对使用composer和自动加载来组织代码相对陌生。我有一个git存储库,在本地机器上,我在项目的根目录中设置composer。我在composer.json中指定了运行所需的所有内容。使用"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');)。每次我试图实例化一个类,我都会得到一个

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

使用use X;并不能解决问题,也不能尝试用其完整的命名空间名称(例如$x = new 'A'B'X();)实例化类

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

+ 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_oce()。。。

所以,这迫使我回到繁琐的方式去做所有需要/包括我自己的事情!?有什么办法解决这个问题吗?

附言:composer dumpautoload对没有帮助

PPS:composer validate显示无错误

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

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

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