Автозагрузка PHP composer не загружает класс

#php #composer-php #autoload #psr-4

#php #композитор-php #автозагрузка #psr-4

Вопрос:

Я только начинаю использовать composer для управления зависимостями, и мне трудно понять, почему я не придерживаюсь psr-4 для автозагрузки, поэтому я здесь за советом. У меня есть класс, который генерирует случайные значения, которые уже есть в packagist. Структура проекта следующая (я пометил файлы composer.json A и B).:

режиссер проекта

   |classfile.php 
A |composer.json
  |vendor
   |autoload.php
    |ejfrancis
      |php-random-value
B       |composer.json
        |RandomValue.php        <--the class I want autoloaded    
 

composer.json A

 {
    "require": {
        "ejfrancis/php-random-value": "dev-master"
    }
}
 

composer.json B

 {
    "name": "ejfrancis/php-random-value",
    "description": "Secure random value generator.",
    "require": {
        "php": ">=5.3.0"        
    },
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "ejfrancis\" : ""
        }
    }
}
 

и, наконец, RandomValue.php файл, который объявляет пространство имен ejfrancis

 namespace ejfrancis;

class RandomValue{
  //foo
}
 

Когда я запускаю приложение, я получаю сообщение об ошибке «класс randomValue не найден», поэтому он не загружается правильно. Я не соблюдаю psr-4, или есть что-то еще, что я делаю неправильно? Я также пробовал автозагрузку, просто используя composer classmap, "classmap" : ["RandomValue.php"] но безуспешно.
Спасибо за помощь

Обновление: я запустил «composer validate» в файле composer.json B, он определенно действителен

Комментарии:

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

2. похоже, вы правы! код был ‘$randomValue = new randomValue’, я добавил ‘use ejfrancis randomValue as randomValue’ в верхней части файла класса, в котором он используется, и теперь он работает. если вы добавите это как полный ответ, а не как комментарий, я отмечу его как правильный

Ответ №1:

Измените свой композитор на "Namespace\" и создайте композитор dump-autoload -o

Комментарии:

1. Я изменил свой атрибут autoload psr-4 в composer.json B на «ejfrancis \»: «» и запустил «composer dump-autoload -o», по-прежнему говорит, что класс не найден

2. Я также запустил ‘composer validate’ для composer.json B, он определенно действителен. вы были правы в отношении завершающего ‘\’

3. Спасибо @ejfrancis за эту команду composer, это помогло мне увидеть, что мой файл composer не был отформатирован должным образом

4. это спасло m день, хотя я опоздал, чтобы найти его