Composer 自动加载 psr 4 通配符扩展以匹配所有模块?
Composer autoload psr 4 wildcard expansions for matching all modules?
我的应用程序有这个结构,
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 中做正则表达式或其他东西,以便 'intelligent' 足以获取所有模块吗?比如,
"module/Artcle/source/"
"module/Book/source/"
"module/Contact/source/"
"module/Admin/Article/source/"
"module/Admin/Book/source/"
"module/Admin/Contact/source/"
....
可能吗?
在这里,应该工作
module\/.*?\/source\/
注意从你的模式"module/*/source/"
,这里的*
在bash
shell上也能很好地工作,它被称为globbing(路径名扩展)。
附加信息
要在 JSON
中完成路径扩展,您可以使用 JSONPath
,这里有一个简单的示例
XPath 与 JSONPath
XPath: /store/*
JSONPath:$.store.*
目前您不能在自动加载定义的目录路径中使用通配符。
但是,您可以调整项目以允许通过更改目录结构自动加载任何 class 模块。您必须删除完全限定 class 名称中未提及的所有级别,即没有 "source"
"Article/source/Article/Model/ArticleModel.php" 托管 \Foo\Article\Model\ArticleModel
需要住在 "Article/Model/ArticleModel.php"
始终可能的替代方法是在自动加载中提及所有模块,或者将它们拆分为自己的 Composer 包。
关于性能的备注:始终尝试使用可能的最长前缀进行自动加载。 "psr-0": { "" : "library" }
将强制 Composer 查看该库目录并为您加载的所有 类 搜索匹配文件。尽管 Composer 试图通过记住失败来优化这一点,但它仍然有影响。
您应该始终添加唯一标识 class 位置的前缀,并且您可以为 PSR-0 添加多个指向同一位置的前缀。对于 PSR-4,位置因性质而异。
考虑编写一个脚本来生成您的自动加载定义。
您可以需要此作曲家插件。它允许使用通配符:
我的应用程序有这个结构,
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 中做正则表达式或其他东西,以便 'intelligent' 足以获取所有模块吗?比如,
"module/Artcle/source/"
"module/Book/source/"
"module/Contact/source/"
"module/Admin/Article/source/"
"module/Admin/Book/source/"
"module/Admin/Contact/source/"
....
可能吗?
在这里,应该工作
module\/.*?\/source\/
注意从你的模式"module/*/source/"
,这里的*
在bash
shell上也能很好地工作,它被称为globbing(路径名扩展)。
附加信息
要在 JSON
中完成路径扩展,您可以使用 JSONPath
,这里有一个简单的示例
XPath 与 JSONPath
XPath: /store/*
JSONPath:$.store.*
目前您不能在自动加载定义的目录路径中使用通配符。
但是,您可以调整项目以允许通过更改目录结构自动加载任何 class 模块。您必须删除完全限定 class 名称中未提及的所有级别,即没有 "source"
"Article/source/Article/Model/ArticleModel.php" 托管 \Foo\Article\Model\ArticleModel
需要住在 "Article/Model/ArticleModel.php"
始终可能的替代方法是在自动加载中提及所有模块,或者将它们拆分为自己的 Composer 包。
关于性能的备注:始终尝试使用可能的最长前缀进行自动加载。 "psr-0": { "" : "library" }
将强制 Composer 查看该库目录并为您加载的所有 类 搜索匹配文件。尽管 Composer 试图通过记住失败来优化这一点,但它仍然有影响。
您应该始终添加唯一标识 class 位置的前缀,并且您可以为 PSR-0 添加多个指向同一位置的前缀。对于 PSR-4,位置因性质而异。
考虑编写一个脚本来生成您的自动加载定义。
您可以需要此作曲家插件。它允许使用通配符: