У меня есть эта структура для моего приложения,
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)
И это мой композитор.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/"
....
Является ли это возможным?
В настоящее время вы не можете иметь подстановочные знаки в пути к каталогу определения автозагрузки.
Однако вы можете настроить свой проект, чтобы разрешить загрузку любого класса модуля путем изменения структуры каталогов. Вы должны избавиться от всех уровней, которые не упоминаются в полностью квалифицированном имени класса, то есть нет "источника",
"Статья/источник/Статья/Модель/ArticleModel.php" hosting \Foo\Article\Model\ArticleModel
должны будут жить в "Article/Model/ArticleModel.php",
Всегда возможной альтернативой является упоминание всех модулей в автозагрузке или их разделение на пакеты Composer самостоятельно.
Замечание относительно производительности: всегда старайтесь использовать самый длинный префикс для автоматической загрузки. "psr-0": { "": "library" }
заставит Composer заглянуть в этот каталог библиотеки и найти соответствующий файл ДЛЯ ВСЕХ КЛАССОВ, которые вы загружаете. Несмотря на то, что Composer пытается оптимизировать это, помня о неудачах, это все равно влияет.
Вы всегда должны добавлять префиксы, которые однозначно идентифицируют местоположение класса, и вы можете добавить несколько префиксов, указывающих на одно и то же местоположение для PSR-0. С PSR-4 местоположение отличается от природы.
Подумайте о написании сценария, который генерирует ваше определение автозагрузки.
Здесь нужно работать
module\/.*?\/source\/
Обратите внимание, с вашего рисунка "module/*/source/"
, то *
здесь будет также хорошо работать на bash
оболочки, оно называется подстановка (подстановка имен файлов).
Дополнительная информация
Чтобы сделать расширение пути в JSON
вы можете использовать JSONPath
который имеет простой пример здесь
XPath против JSONPath
XPath: /store/*
JSONPath: $.store.*
"require"
, например,"slim/views": "0.1.*"
Но не в"autoload"
.