Автоматическая загрузка собственного кода с помощью composer

#php #namespaces #composer-php #autoload

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

Вопрос:

Я пытаюсь создать свой собственный проект composer и пытаюсь протестировать код, чтобы убедиться, что он работает, когда я начинаю его создавать. Я прочитал десятки руководств и вопросов о переполнении стека, и все, кажется, указывают на то, что я все делаю правильно, хотя, поскольку это не работает, я полагаю, что это не так.

У меня есть файловая структура:

 index.php
composer.json
composer.lock
vendor/
src
    Frankenstein
         DB
            |FrankensteinDB.php
  

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

 {
  "autoload": {
    "psr-4" : {"Frankenstein\":"src/Frankenstein"}
  },
  "require": {
    "enrise/frisbee": "0.1.0"
  }
}
  

FrankensteinDB.php выглядит так:

 <?php

namespace FrankensteinDB;

use FrisbeeExceptionFlingable;

class FrankensteinDB extends Flingable
{   
    public function __construct($name)
    {
        parent::__construct($name, 1337);
    }

    public function run()
    {
    }

    public function next()
    {
    }
}
  

и, конечно, наконец, index.php заключается в следующем:

 <?php

require_once 'vendor/autoload.php';

use FrankensteinDBFrankensteinDB;

try {
    throw new FrankensteinDB('frankenstein');
} catch (Error $e){
    $e->getCode();
}
  

каждый раз, когда я запускаю код, я получаю Class 'FrankensteinDBFrankensteinDB' not found и я просто не могу понять, почему. Я перепробовал все комбинации папок в части namespace, use и composer psr-4, и, похоже, ничего не работает. Я также запускаю composer update после каждого изменения, чтобы убедиться, что файлы автозагрузки восстанавливаются.

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

1. Код правильный, за исключением перехвата Error вместо FrankensteinDB или Exception . Кроме того, вы не можете видеть результаты $e->getCode(); . Вы, вероятно, хотели что-то вывести. Попробуйте var_dump($e->getCode();

2. @RuslanOsmanov Ошибка, которую я улавливаю, — это ошибка FrankensteinDB, которая не найдена, у меня есть специальный обработчик ошибок для FrankensteinDB в пакете frisbee.

3. Структура и опубликованный вами код действительно работают (я только что протестировал это). Как я уже упоминал, он работает некорректно, но работает без class not found ошибок. Попробуйте воспроизвести его с нуля (в другом каталоге). Попробуйте обновить сам composer. Попробуйте протестировать его из CLI: php index.php .

4. Ха, это действительно работает. Интересно, что не так с папкой, в которой он у меня есть.