За последние 24 часа нас посетили 26426 программистов и 1545 роботов. Сейчас ищут 798 программистов ...

Не работает composer psr-4 autoloader - помогите найти ошибку

Тема в разделе "PHP для новичков", создана пользователем Walk, 13 апр 2018.

  1. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Код: https://github.com/WalkWeb/fuckingautoload

    Попытка запустить index.php приводит к ошибке:
    Fatal error: Class 'myapp\web\Page' not found in /var/www/myapp.loc/index.php on line 9

    До этого никогда не использовал автозагрузчик из composer - подскажите, где ошибка?
     
  2. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    а не из композера автозагрузчик использовал?
     
  3. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    да

    Но цель не просто сделать "лишь бы какой автозагрузчик", а понять, почему автозагрузчик из composer не работает.
     
  4. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    В autoload_psr4 нэймспейс liw на web стоит. Попробуй "liw\Page" ну и в классе namespace liw
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а как он его увидит, если он не в vendor лежит, а другого путя к нему никакого не прописано? :D
    --- Добавлено ---
    кстати, я вот не пользуюсь автолоадером композера для загрузки того, что приходит не из композера.
    я делаю как-то так:
    PHP:
    1. /* autoload */
    2. /* это композерный автолоад, пусть он подгружает те либы, которые поставлены через композер */
    3. require 'vendor/autoload.php';
    4. /* а это мой автолоад, который подгружает моё оттуда, где я это создаю */
    5. spl_autoload_register(function ($class) {
    6.     $class = strtolower($class);
    7.     $file = SrcPath . '/lib/' . str_replace('\\', '/', $class) . '.php';
    8.     if (!file_exists($file)) {
    9.         return false;
    10.     }
    11.     require $file;
    12.     return true;
    13. });
    14. /* /autoload */
     
  6. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    вообще не догоняю всех этих модных "dirname(__FILE__)" ведь __DIR__ и так уже директория, нах ее через функцию получать?!
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    а dirname(__FILE__, 3) чем меняешь ?
     
  8. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Это понятно, но композер вроде как не одним специалистом написан, и вот это
    PHP:
    1. $vendorDir = dirname(dirname(__FILE__));
    2. $baseDir = dirname($vendorDir);
    куда логичнее можно написать так
    PHP:
    1. $vendorDir = dirname(__DIR__);
    2. $baseDir = dirname($vendorDir);
    Судя по коммитам __DIR__ появился после пхп 5.3. Теперь все понятно
     
    #8 gruth, 13 апр 2018
    Последнее редактирование: 13 апр 2018
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Код (Text):
    1. {
    2.     "autoload": {
    3.         "psr-4": {"MyNamespace\\": "srcDirForMyNamespace/"}
    4.     }
    5. }
    Для файлов, где нет неймспейса (к примеру, набор функций):

    Код (Text):
    1. {
    2.     "autoload":{
    3.         "files":["src/MyFuntions.php"]
    4.     }
    5. }
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    во фреймворках можно тоже найти тучу бреда. Просто не обновляют то что не требуется изменению
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто __DIR__ только в 5.3 ввели, вот оно и осталось с тех пор
     
  12. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Никто не пробовал скачать репозиторий и попробовать заставить автозагрузчик работать?
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  14. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Да знаю я это все)

    Вы не догоняете в чем проблема - у меня на другом проекте все нормально работает, я даже на этом починил - часа два сидел, искал в чем причина, в итоге в какой-то момент все заработало, а я так и не понял, в чем была ошибка.

    Это как не компилируется программа, а потом оказалось, что запятую забыл - хочу понять где закралась ошибка.