【问题标题】:Composer autoload psr 4 wildcard expansions for matching all modules?Composer 自动加载 psr 4 通配符扩展以匹配所有模块?
【发布时间】:2015-11-23 21:30:15
【问题描述】:

我的应用程序有这个结构,

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/"
        }
    }
}

如您所见,我在 .json 中有这个 "module/*/source/"。我这样做的原因是因为我想避免写出每个模块,因为这将是一长串。当我有新模块时它也不灵活,然后我必须对 .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/"
....

有可能吗?

【问题讨论】:

    标签: php json regex composer-php psr-4


    【解决方案1】:

    你可以要求这个作曲家插件。它允许使用通配符:

    psr4-advanced-wildcard-composer-plugin

    【讨论】:

    【解决方案2】:

    目前您不能在自动加载定义的目录路径中使用通配符。

    但是,您可以调整项目以允许通过更改目录结构来自动加载模块的任何类。您必须摆脱完全限定类名中未提及的所有级别,即没有“源”

    托管\Foo\Article\Model\ArticleModel的“Article/source/Article/Model/ArticleModel.php”需要住在“Article/Model/ArticleModel.php”中

    始终可能的替代方法是在自动加载中提及所有模块,或者将它们单独拆分为 Composer 包。

    关于性能的备注:始终尝试使用可能的最长前缀进行自动加载。 "psr-0": { "" : "library" } 将强制 Composer 查看该库目录并搜索您加载的所有类的匹配文件。尽管 Composer 试图通过记住失败来优化这一点,但它仍然会产生影响。

    您应该始终添加唯一标识类位置的前缀,并且您可以为 PSR-0 添加多个指向同一位置的前缀。对于 PSR-4,位置因性质而异。

    考虑编写一个脚本来生成您的自动加载定义。

    【讨论】:

    • 感谢您的回答。我希望 Composer 尽快在自动加载定义中进行通配符扩展,因为它没有意义,而您可以在 "require" 中这样做,例如 "slim/views": "0.1.*" 但不能在 "autoload" 中。
    • 在 Github 上为它创建一个问题。
    【解决方案3】:

    在这里,应该可以工作

    module\/.*?\/source\/
    

    注意从你的模式"module/*/source/",这里的* 也可以在bash shell 上很好地工作,它被称为globbing(路径名扩展)。

    其他信息

    要在JSON 中完成路径扩展,您可以使用JSONPath,这里有一个简单的示例

    XPath 与 JSONPath

    XPath:/store/*

    JSONPath:$.store.*

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

    【讨论】:

    • 我认为答案可能不能,因为 json 是一个纯粹的数据对象。可能的方式可能是稍后使用 php 处理它。
    • 这里 en.wikipedia.org/wiki/JSON#Unsupported_native_data_types 告诉你 JSON 不支持正则表达式数据类型,这可能意味着 JSON 中的路径名扩展是不可能的。
    • @teelou 我发现你可以使用JsonPath,它允许你使用路径扩展。
    • 您是在讨论通用 JSON 允许通配符扩展的可能性吗?这一点都不重要,因为 JSON 将被 Composer 使用 - 而 Composer 不提供在自动加载定义中进行通配符扩展的功能。如果您想拥有它,请发送拉取请求 - 在那之前:它不会起作用。
    猜你喜欢
    • 2014-07-25
    • 2015-04-20
    • 2018-07-25
    • 2014-08-12
    • 1970-01-01
    • 2020-09-30
    • 2014-11-01
    • 2014-03-24
    • 2018-06-01
    相关资源
    最近更新 更多