1

私は自分のアプリにこの構造を持っています。

myapp/
  config/ (config and setup)
  module/ (tons of modules!)
     Article/ (one of the modules)
        source/ (<----- note that all php psr4 classes are stored in this folder)
           Article
              Model/
                 ArticleModel.php
                 ArticlesModel.php
              Controller/
              View/
     Book/ (one of the modules)
       ....(the structure is the same as Article's)
  public/  (web site doc root)
  vendor/
    composer/
    ...(other packages)

そして、これは私の composer.json です。

{
    "require": {
        "slim/slim": "~2.0",
        "slim/views": "0.1.*"
    },
    "autoload": {
        "psr-4": {
            "Foo\\": [
                "module/*/source/"
            ]
        },
        "psr-0": {
            "": "library/"
        }
    }
}

ご覧のとおり、これ"module/*/source/"は .json に含まれています。これを行う理由は、長いリストになるので、すべてのモジュールを書き出すのを避けたいからです。また、新しいモジュールがある場合も柔軟ではなく、.json に変更を加える必要があります。

しかし、"module/*/source/"機能していません。すべてのモジュールを取得するのに十分なほど「インテリジェント」になるように、この .json で正規表現などを実行できますか? そのような、

"module/Artcle/source/"
"module/Book/source/"
"module/Contact/source/"
"module/Admin/Article/source/"
"module/Admin/Book/source/"
"module/Admin/Contact/source/"
....

出来ますか?

4

3 に答える 3

2

現在、オートローディング定義のディレクトリ パスにワイルドカードを使用することはできません。

ただし、ディレクトリ構造を変更することで、プロジェクトを調整して、モジュールの任意のクラスを自動ロードできるようにすることができます。完全修飾クラス名で言及されていないすべてのレベルを取り除く必要があります。つまり、「ソース」はありません。

「Article/source/Article/Model/ArticleModel.php」ホスティング\Foo\Article\Model\ArticleModelは、「Article/Model/ArticleModel.php」に存在する必要があります。

常に可能な代替手段は、オートロードですべてのモジュールを言及するか、それらを独自の Composer パッケージに分割することです。

パフォーマンスに関する注意: オートロードには、常に可能な限り長いプレフィックスを使用するようにしてください。"psr-0": { "" : "library" }Composer にそのライブラリ ディレクトリを調べさせ、ロードしたすべてのクラスに対して一致するファイルを検索させます。Composer は失敗を記憶することでこれを最適化しようとしますが、それでも影響があります。

クラスの場所を一意に識別するプレフィックスを常に追加する必要があり、PSR-0 の同じ場所を指す複数のプレフィックスを追加できます。PSR-4は性質上位置が異なります。

オートローディング定義を生成するスクリプトを作成することを考えてみてください。

于 2015-08-29T10:25:07.277 に答える
0

ここで、動作するはずです

module\/.*?\/source\/

あなたのパターンから注意"module/*/source/"してください。ここではシェルで*もうまく機能します。これはグロビング(パス名展開)と呼ばれます。bash

追加情報

パス展開を行うには、ここで簡単な例をJSON使用できますJSONPath

XPath と JSONPath

XPath:/store/*

JSONパス:$.store.*

参照: http://goessner.net/articles/JsonPath/

于 2015-08-29T09:52:49.177 に答える