我正在尝试在我的项目中实现PSR-4自动加载。这是我继承的现有应用程序,它目前还没有使用OOP(它都是脚本化的),但我希望随着时间的推移重构使用OOP,而PSR-4对我来说至关重要,因为它会最终成为一个大项目。
目前我们不依赖任何外部库(完全由内部编写的旧应用程序),因此作曲家此时仅用于自动加载,但最终将使用第三方软件包,例如phpunit
我服务器上的应用程序结构如下所示:
/var/www/appurl/
│ composer.json
│
├───htdocs
│ ├───AppName
│ │ ├───admin
│ │ │ authenticated.php
│ │ │ init.php
│ │ │ login.php
│ │ │
│ │ └───php
│ │ └───search.php
│ └───Framework
│ ├───Helpers
│ │ └───OSHelpers.php
└───vendor
│ autoload.php
│
└───composer
autoload_classmap.php
autoload_namespaces.php
autoload_psr4.php
autoload_real.php
ClassLoader.php
composer.json:
{
"autoload": {
"psr-4": {
"Framework\\": "htdocs/Framework"
}
}
}
login.php在用户成功登录时调用authenticated.php,并通过身份验证调用我的init.php脚本,该脚本包含:
<?php
require_once('../../../vendor/autoload.php');
?>
是有错误的search.php。用户在通过身份验证后会被重定向到search.php。
search.php有以下几行:
use Framework\Helpers\OSHelpers;
$current_os = OSHelpers::GetConciseOSFromUserAgent($user_agent);
OSHelpers.php的名称空间为:命名空间Framework \ Helpers;
如果使用 require_once ,对OSHelpers的静态调用工作正常,但是我定义$ current_os的第二行是它看起来失败的地方。
我收到的错误是:
Fatal error: Class 'Framework\Helpers\OSHelpers' not found in /var/www/appurl/htdocs/AppName/php/search.php on line 829
我为什么会这样做有点不知所措?当我按照此视频中的示例(https://www.youtube.com/watch?v=VGSerlMoIrY)时,我的示例应用程序运行正常,但尝试以稍微复杂的结构复制它会给我带来问题。
我已经完成了composer dump-autoload -o,在vendor目录中查看显示我的类已正确定义。来自vendor / composer / autoload_classmap.php:
'Framework\\Helpers\\OSHelpers' => $baseDir . '/htdocs/Framework/Helpers/OSHelpers.php',