2

PHP の PSR-4 標準と互換性を持たせるためにレガシー PHP アプリケーションをリファクタリングすることに関して質問があります。まだ適切に名前空間が設定されていない app/classes/ フォルダーにいくつかのクラスがあり、composer の vendor/autoload.php を呼び出したときにそれらを直接オートロードしたいと考えています。に従って名前空間を追加し、 composer の vendor フォルダーの下にディレクトリ\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>を作成しようとしvendor/myapp/classes/src/、dump-autoload コマンドを実行しましたが、役に立ちませんでした。クラスがロードされず、composer はそれを見つける場所を見つけられません。これを行う方法についての指針はありますか?

ありがとう、

1月

注意事項: -> コードは内部使用のみであるため、Packagist のように公的に検索可能なリポジトリにソース コードをアップロードしたくありません。

編集: ここに私の composer.json があります:

...
  "autoload":{
    "psr-4": {
      "Myapp\\" : "Myapp"
    }
  },
...

しかし、構造は次のようになります。

->Myapp
-->Classes
--->Module1
---->submodule.php
--->Module2
---->submodule2.php
--->Module3
---->submodule3.php
--->Config
---->config.db.php

->vendor
-->autoload.php

ここに私の問題/質問があります:

  1. submodule2.php と submodule3.php をロードする submodule.php をロードしようとすると、submodule3.php が見つからないことがわかります。submodule3.php の名前空間は Myapp\Classes\Module3 ですが、見つからないと表示されます。
  2. autoload.php を呼び出すたびに config.db.php を強制的にインクルードしたい
4

2 に答える 2

1

私は今それを理解しました。ただし、ソース ファイルは /vendor フォルダーには存在しません。これは私の場合は問題ありません。ファイルがどのフォルダーに関係なく自動的に自動ロードされるようにする場合は、それを composer.json の psr-4 ブロックに追加するか、まだそこにない場合は作成します。私のcomposer.jsonでは、最上位オブジェクトにこのブロックがあり、自動ロードしたいフォルダーを追加し、ある種の構成ファイルのように、含めたい特定のファイルも含めます:

  ... 
  "autoload":{
    "files": [
      "somefolder/somefile.php"
    ],
    "psr-4": {
      "MyApp\\" : "MyApp"
    }
  },
  ...

これは単に、コンポーザーが MyApp ディレクトリに存在するファイルを自動ロードする必要があることを意味します。このディレクトリには MyApp の名前空間もあります。

したがって、私のフォルダー構造は次のようになります。

->MyApp
-->Classes
--->MyClass1.php   --> namespace MyApp\Classes classname: MyClass1
-->Components
--->MyClass2.php   --> namespace MyApp\Classes classname: MyClass2
->somefolder
-->somefile.php
->vendor
-->autoload.php
->index.php

したがって、ファイル MyClass1.php を index.php に含めたい場合は、次のように追加します。

include_once( __DIR__ . "/vendor/autoload.php");

use \MyApp\Classes\MyClass1;

$foo = new MyClass1();
$foo->bar();

それが役に立てば幸い。

于 2015-08-19T13:33:18.130 に答える