プロジェクトに PSR-4 オートローディングを実装しようとしています。これは私が継承した既存のアプリケーションであり、現在 OOP を使用していません (すべてスクリプト化されています) が、OOP を使用するように時間をかけてリファクタリングしたいと考えています。PSR-4 は最終的に大規模なプロジェクトになるため、私にとって非常に重要です。 .
現時点では、外部ライブラリ (完全に社内で作成された古いアプリケーション) に依存していないため、composer は現時点では自動読み込みにのみ使用されていますが、最終的には 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 を呼び出し、authenticated は、以下を含む私の 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 の名前空間は次のとおりです。
require_onceが使用されている場合、OSHelpers への静的呼び出しは正常に機能しますが、$current_os を定義する 2 行目で失敗しているように見えます。
私が受け取るエラーは次のとおりです。
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/composer/autoload_classmap.php から:
'Framework\\Helpers\\OSHelpers' => $baseDir . '/htdocs/Framework/Helpers/OSHelpers.php',