部署后 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/
我对使用 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/