За последние 24 часа нас посетили 22296 программистов и 1156 роботов. Сейчас ищут 723 программиста ...

Автозагрузка классов внутри скриптов composer

Тема в разделе "Версионность, тестирование и развёртывание", создана пользователем Popsa y psa, 14 окт 2021.

  1. Popsa y psa

    Popsa y psa Новичок

    С нами с:
    24 май 2020
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте.
    Подскажите, пожалуйста, как можно загрузить классы, определённые в композере, в скриптах композера?

    composer.json:
    Код (Text):
    1. {
    2.     "name": "Some package",
    3.     "license": "MIT",
    4.     "minimum-stability": "dev",
    5.     "require": {
    6.         "php": "^7.3 || ^8.0"
    7.     },
    8.     "autoload": {
    9.         "psr-4": {
    10.             "MyVendor\\": "src/"
    11.         }
    12.     },
    13.     "scripts": "MyVendor\\Database\\Migration::install"
    14. }
    MyVendor\\Database\\Migration::install:
    Код (Text):
    1. $db = \Config\Database::connect($velldoris_app_config->DBGroup);
    2. $migrations = service('Migrations', config('Config\Migrations'), $db);
    3. $migrations->latest();
    Метод install должен запускать миграции при установке/обновлении пакета. Но, так как загруженных классов внутри него нет, то и выполнить что-либо невозможно.
    Понятное дело, что нужно подключить нужные мне классы (а лучше весь проект). Но как правильно это сделать? В доках композера нашёл только как определить путь до самого пакета, который устанавливается. А до загрузчика /vendor/autoload.php (который не пакетный, а самого композера) не могу найти.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    https://stackoverflow.com/q/12781276/272885 How to define custom autoloader in composer?
    Код (Text):
    1. {
    2.     "autoload": {
    3.         "files": ["src/extra/autoloader.php"]
    4.     }
    5. }
    если набирать в поисковике свой вопрос по английски, с большой вероятностью находится годное
    --- Добавлено ---
    Update: прости, не сразу понял вопрос. Как прописать путь до самого автозагрузчика composer — его очевидно надо прописать в твоей точке входа, т.е. в том файле на который вебсервер перекидывает все запросы, например в public/index.php

    require __DIR__.'/../vendor/autoload.php';
     
  3. Popsa y psa

    Popsa y psa Новичок

    С нами с:
    24 май 2020
    Сообщения:
    4
    Симпатии:
    0
    Спасибо за ответ!

    У меня и не получается определить точку входа в приложение из колбеков композера. В этом и вопрос. В документации вроде всё разжёвано:
    https://getcomposer.org/doc/articles/scripts.md
    Объект события передаётся в статический метода, указанный в свойстве scripts файла composer.json. В моём случае в install:
    Код (Text):
    1. "scripts": "MyVendor\\Database\\Migration::install"
    Но дальше не могу понять какой метода использовать. Смог получить директорию пакета:
    PHP:
    1. $event->getComposer()->getConfig()->get('vendor-dir');
    Но этого мало, мне нужны классы самого приложения, а не только моего пакета.

    Колбеки композера запускаются без участия вебсервера. Надеюсь, правильно выразился.
     
  4. Popsa y psa

    Popsa y psa Новичок

    С нами с:
    24 май 2020
    Сообщения:
    4
    Симпатии:
    0
    PHP:
    1. define('PACKAGE_DIR', __DIR__);
    2. define('PROJECT_DIR', rtrim(stristr(PACKAGE_DIR, 'vendor', true), '/'));
    3. require PROJECT_DIR . '/vendor/autoload.php';
    Придумал только такой топорный вариант. Если есть нормальный способ - подскажите, пожалуйста.