PHP class_exists () не может найти класс, который действительно существует

#php #cakephp #namespaces #autoload

#php #cakephp #пространства имен #автозагрузка

Вопрос:

Я пытаюсь написать плагин аутентификации CakePHP и слежу за ним и структурирую его после этого репозитория:https://github.com/ADmad/cakephp-jwt-auth

Я все еще на ранних стадиях, пытаюсь загрузить свой плагин с помощью метода CakePHPs constructAuthenticate() . Я сузил свою проблему до того, что этот метод никогда не находит мой класс при вызове class_exists()

У меня есть структура проекта следующим образом:

App/
plugins/
src/
Controller/
AppController.php
Model/
vendor/
Admad/
cakephp-jwt-auth/
src/
Auth/
JwtAuthenticate.php
composer.json
nates/
cakephp-total-auth/
src/
Auth/
TotalAuthenticate.php
composer.json

TotalAuthenticate это класс, который я пытаюсь загрузить, и его пространство имен, как определено в TotalAuthenticate.php , является:

namespace natesTotalAuthauth;

После некоторой отладки я обнаружил, что передаваемый путь classs_exists() является:

natesTotalAuthAuthTotalAuthenticate

Я сравнил всю эту информацию с Admad/JwtAuth плагином, и все относительные пути совпадают, и этот плагин загружается просто отлично, поэтому я действительно в недоумении, что здесь происходит и почему мой плагин не загружается.

Моя автозагрузка в App/composer.json выглядит следующим образом:

 `"autoload": {
        "psr-4": {
            "App\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\Test\": "tests/",
            "Cake\Test\": "vendor/cakephp/cakephp/tests/"
        }
    },`
  

И мои Плагины composer.json :

 `"autoload": {
    "psr-4": {
      "nates\TotalAuth\": "src"
    }
  },
  "autoload-dev": {
    "psr-4": {
//      "ADmad\JwtAuth\Test\": "tests"
    }` 
  

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

1. Что в вашей composer.json автозагрузке?

2. @ccKep Спасибо, что взглянули на это. Я обновил вопрос как с помощью моего приложения / composer.json, так и с помощью моего плагина / composer.json, поскольку я не знал, какой из них вы хотели увидеть

3. @ccKep Я поиграл с плагином ADmad / cakephp-jwt-auth (тот, который загружается правильно), и я смог прервать его загрузку и исправить это снова. Это привело меня к выводу, что моего плагина (nates / TotalAuth) нет в списке autoload_static.php файл, пока ADmad есть. Может быть, поэтому PHP не распознает мой класс? Должен ли я вообще редактировать это autoload_static.php напрямую в файл?

4. Вам не следует редактировать этот файл напрямую, он создается composer dump-autoload — поэтому запустите эту команду.

Ответ №1:

Стандарт автоматической загрузки PSR-4 требует, чтобы пространство имен соответствовало файловой структуре с учетом регистра. Вы определяете свое пространство имен в composer.json с заглавными natesTotalAuth буквами, но в вашем классе как natestotalauth... .

Убедитесь, что все оболочки совпадают, а оболочки соответствуют файловой структуре.

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

1. Извините, это была проблема, когда я вводил его в SO. Все оболочки совпадают

2. Я поиграл с плагином ADmad / cakephp-jwt-auth (тот, который загружается правильно), и я смог прервать его загрузку и исправить это снова. Это привело меня к выводу, что моего плагина (nates / TotalAuth) нет в списке autoload_static.php файл, пока ADmad есть. Может быть, именно поэтому PHP не распознает мой класс? Должен ли я вообще редактировать это autoload_static.php подать напрямую?