Почему возникает ошибка "PHP Fatal error: Uncaught Error: Class '...' not found in ..." при загрузке библиотеки через Composer?

236
05 января 2022, 08:50

Написал (но и сейчас пишу) библиотеку для работы с API. Для библиотеки создал папку с названием amoNG и туда при разработке поместил все файлы

  • src/AmoNG - исходники библиотеки
  • projects - провожу локальные тесты библиотеки, т.е. инициализирую ее там и работаю с ней

До этого структура была другой, все файлы были не в src/AmoNG, а рядом с папкой projects. До этого момента composer все видел и всё работало. Но сейчас я посмотрел как сделана структура в других репозиториях, изменил ее, залил composer.json и загрузил в packagist. Мой composer.json для packagist'а:

{
    "name": "myname/among",
    "description": "PHP библиотека",
    "type": "library",
    "license": "AGPL-3.0",
    "authors": [
        {
            "name": "MyName",
            "email": "MyMail"
        }
    ],
    "keywords": ["API", "amoCRM", "amoNG"],
    "require": {
        "php": ">=5.4.0",
        "ext-curl": "*",
        "ext-json": "*",
        "ext-fileinfo": "*"
    },
    "autoload": {
        "psr-4": { "AmoNG\\": "src/AmoNG" }
    },
    "config": {
        "bin-dir": "vendor/bin",
        "process-timeout": 600
    }
}

Внутри src/AmoNG такая структура: Сейчас в projects создаю файл для проверки библиотеки, ввожу composer require myname/among:dev-master, всё прогружается, подключаю require_once(__DIR__ . '/vendor/autoload.php'); И при попытке инициализировать класс из библиотеки, выскакивает ошибка PHP Fatal error: Uncaught Error: Class '...' not found in ... Пытаюсь в тестовом файле папки projects инициализировать класс Logger и выпадает вышеописанная ошибка. В файле Logger такая начальная структура:

<?php
namespace AmoNG;
class Logger
{

Когда я сделал require внутри projects, сформировался composer.json такого содержания:

{
    "require": {
        "myname/among": "dev-master"
    }
}

Я ничего там не менял. Также, попытался сделать инициализацию класса в папке Entities, например, Companies, также вылетает ошибка. У файла Companies такое начало:

<?php
namespace AmoNG\Entities;
use AmoNG\Entities\AbstractEntity;
/**
 * класс для работы с компаниями
 */
class Companies extends AbstractEntity
{

Начальный код тестового файла в папке projects при инициализации класса Logger:

<?php
require_once(__DIR__ . '/vendor/autoload.php');
use AmoNG\Logger;

А также Companies:

<?php
require_once(__DIR__ . '/vendor/autoload.php');
use AmoNG\Entities\Companies;

Суть: почему я не могу получить доступ к классам? Структуру я соблюдаю, namespace адекватно написал, по иерархии.

Answer 1

оказывается, что если локально написать код, а потом его загрузить на github, сразу сделать require в composer, то будет загружен старый код (если до этого репозиторий индексировался в packagist). Возникает это из-за того, что packagist около 5 минут синхранизируется с репозиторием github. Из-за этого у меня методы были недоступны. Итого: - или ждать синхронизации файлов на стороне packagist - или подключать через composer пакет локально, тестировать и по итогу делать push на github

READ ALSO
Как отключить уведомления о действиях пользователей на сайте wordpress?

Как отключить уведомления о действиях пользователей на сайте wordpress?

Как отключить уведомления на почту администратора сайта о действиях зарегистрированных пользователей? к примеру пользователь поменял пароль,...

79
Как можно можно вывести определенный столбец в зависимости от локализации проекта на Laravel

Как можно можно вывести определенный столбец в зависимости от локализации проекта на Laravel

Это мой первый и тестовый проект на laravelПодскажите пожалуйста как можно можно вывести определенный атрибут в зависимости от локализации...

95
Ошибка “PHP Notice: Undefined offset: 1 in…”

Ошибка “PHP Notice: Undefined offset: 1 in…”

Перебираю массив на совпадения, те которые совпадают - удаляю

73