使用composer和autoload组织我的代码相对较新。我有一个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_once()......
所以,这迫使我回到执行所有要求/包括我自己的繁琐方式!?有什么方法可以解决这个问题吗?
PS:composer dumpautoload
不会帮助
PPS:composer validate
显示没有错误
答案 0 :(得分:1)
对于PSR-4合规性,您的文件结构应为:
+ src/
| + X.php
| + Y.php
请注意删除.class.php后缀。 http://www.php-fig.org/psr/psr-4/