Composer autoload psr 4 расширения подстановочных знаков для сопоставления всех модулей?

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)

И это мой композитор.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/"
....

Является ли это возможным?

Теги:
composer-php
psr-4

2 ответа

2
Лучший ответ

В настоящее время вы не можете иметь подстановочные знаки в пути к каталогу определения автозагрузки.

Однако вы можете настроить свой проект, чтобы разрешить загрузку любого класса модуля путем изменения структуры каталогов. Вы должны избавиться от всех уровней, которые не упоминаются в полностью квалифицированном имени класса, то есть нет "источника",

"Статья/источник/Статья/Модель/ArticleModel.php" hosting \Foo\Article\Model\ArticleModel должны будут жить в "Article/Model/ArticleModel.php",

Всегда возможной альтернативой является упоминание всех модулей в автозагрузке или их разделение на пакеты Composer самостоятельно.

Замечание относительно производительности: всегда старайтесь использовать самый длинный префикс для автоматической загрузки. "psr-0": { "": "library" } заставит Composer заглянуть в этот каталог библиотеки и найти соответствующий файл ДЛЯ ВСЕХ КЛАССОВ, которые вы загружаете. Несмотря на то, что Composer пытается оптимизировать это, помня о неудачах, это все равно влияет.

Вы всегда должны добавлять префиксы, которые однозначно идентифицируют местоположение класса, и вы можете добавить несколько префиксов, указывающих на одно и то же местоположение для PSR-0. С PSR-4 местоположение отличается от природы.

Подумайте о написании сценария, который генерирует ваше определение автозагрузки.

  • 0
    Спасибо за ответ. Я надеюсь, что Composer будет иметь подстановочный знак в определении автозагрузки, так как это не имеет смысла, в то время как вы можете сделать это в "require" , например, "slim/views": "0.1.*" Но не в "autoload" .
  • 1
    Создайте для него проблему на Github.
Показать ещё 1 комментарий
0

Здесь нужно работать

module\/.*?\/source\/

Обратите внимание, с вашего рисунка "module/*/source/", то * здесь будет также хорошо работать на bash оболочки, оно называется подстановка (подстановка имен файлов).

Дополнительная информация

Чтобы сделать расширение пути в JSON вы можете использовать JSONPath который имеет простой пример здесь

XPath против JSONPath

XPath: /store/*

JSONPath: $.store.*

Ссылка: http://goessner.net/articles/JsonPath/

  • 0
    Нет. это не работает ...
  • 0
    Я думаю, что ответ, возможно, не может, потому что JSON является чисто объектом данных. Возможный способ может быть обработать его позже, используя php.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню