Php composer autoload psr 4 не работает

Автозагрузка Composer PSR-4 не работает после развертывания

У меня есть свой собственный маленький MVC-фреймворк, и я использую автозагрузку psr-4 composer.

На моем собственном компьютере он работает отлично, но когда я развернул его на своем сервере Ubuntu, он больше не работал. (он больше не находит никаких классов) Я много чего перепробовал, но ничего не получится, просто не получится …

Что я пробовал:

  • композитор дамп-автозагрузка
  • обновление композитора
  • удаляя все и загружая снова
  • ищу в интернете пару часов … 🙁

Это мой composer.json:

Я просто не понимаю, почему это не работает на моем сервере ….
Я использую другую версию php на моем сервере: 7.1, и я использую 5.6 на своем компьютере, но это не должно иметь никакого значения, верно?

Как мне исправить эту проблему? Я просто не понимаю, почему это происходит …. 🙁

РЕДАКТИРОВАТЬ:

Структура файла на сервере:

Я исключил карту продавца из дерева

Решение

хорошо … я исправил это.

Я не знаю почему и как это работает, но это работает …: D

Я изменил свой composer.json на это:

Другие решения

Если вы хотите использовать PSR-4, вам нужно капитализировать ваши каталоги

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

Источник

Автозагрузка классов с помощью Composer.

В одной из своих статей я писал о том, как создать свой автозагрузчик классов на php. Но автозагрузку классов для своего проекта можно сделать и с помощью менеджера зависимостей для PHP — Composer. Это особенно актуально, если проект достаточно большой и планируется использование Composer в качестве установки сторонних библиотек (зависимостей).

Для внесения своих данных в файлы автозагрузчика Composer, нужно внести изменения в файл composer.json, а если его еще нет в корне приложения – создать.
Создание осуществляется с помощью выполнения в командной строке, например в консоли OpenServera:

Перед этим нужно перейти в корневой каталог приложения.
Если Composer установлен не глобально, то вместо composer нужно писать php composer.phar.

При этом будет предложено ввести данные по названию проекта, автору, предложено сразу вписать нужные зависимости. Эти данные не имеют отношения к автозагрузке классов. В принципе, можно вообще создать самому файл composer.json и разместить там в фигурных скобках только объект autoload:

Читайте также:  Nginx gzip как настроить

Если же создавать данный файл с помощью команды composer init или использовать файл который уже имеется (если объект autoload отсутствует), то нужно поставить запятую после последнего элемента (но до последней фигурной скобки) и вписать блок autoload.

В данном примере указано, что для автозагрузчика будет использоваться стандарт кодирования PSR-4, согласно которому используется пространство имен классов, файлы классов имеют названия соответствующие названиям находящихся в них классов и тд. подробнее https://zenwalker.me/blog/php-psr-0-vs-psr-4

Согласно примера, для пространства имен начинающегося с Services должна подключаться папка с названием services, находящаяся в корне приложения. С App аналогично.
То есть, например, класс Services\Application должен находиться в папке services/Application.php, тогда Composer автоматически подключит его.

Раздел autoload может включать и другие подразделы: classmap, files.

Подраздел classmap отвечает за описание классов, именование которых не соответствует стандарту PSR-4. То есть, в карте классов мы просто указываем где искать определенные классы. Например:

Тут первым элементом массива classmap указываем каталог в котором нужно искать требуемые файлы классов. При этом не уточняем название класса.
Вторым элементом показан пример указания конкретного файла класса, чтобы Composer не приходилось искать в папке services/myserv что-то еще. Конечно стоит прописывать или первый или второй вариант.

Подраздел files отвечает за описание файлов, которые нам необходимо подключать в самом начале исполнения приложения. Например это настройки приложения — config.php. Вместо того, чтобы подключать его в index.php:
можно указать, чтобы его подключил Composer:
в данном случае подключится файл config.php находящийся в корне приложения (там же где и файл composer.json куда это прописываем). Можно подключить любой файл указав путь к нему.

То есть структура блока autoload может включать разные компоненты:

После вписывания нужного кода в объект autoload, сохраняем изменения и далее нужно выполнить обновление файлов автозагрузчика Composer. Если файл composer.json вы сами перед этим создавали, то файлов автозагрузчика еще и вовсе нет. Для того, чтобы они появились, выполните
создастся папка vendor, а в ней папка composer с файлами автозагрузки. Там же будет файл autoload_psr4.php в котором перезаписаны наши правила поиска классов согласно стандарта psr-4 и аналогичные файлы для карты классов и файлов.

Если папка vendor с данными файлами уже была, а вам нужно изменить данные для подключения своих классов, то нужно выполнить команду:
которая обновит файлы автозагрузчика Composer и при этом не будут устанавливаться и обновляться зависимости (библиотеки прописанные в блоке require).
Используя после команды ключ «-o», что значит «optimize», классы соответствующие стандарту psr-4 и прописанные для данного объекта будут прописаны в карте классов, что ускорит их загрузку в дальнейшем.

Читайте также:  Не работает обогрев руля киа спортейдж 3 2014

Источник

Composer PSR-4 autoload is not working after trying multiple methods and tutorials [duplicate]

I was making a composer library for functionality of my framework, but I got stuck on this problem, the problem is with autoloading with psr-4.

My Configuration

I have the following structure

The last folder is my library with the hello folder in it.

inside of the root of the hello folder I have a composer.json and a src folder.

composer.json

Inside of the src/ folder is the main file — > index.php .

index.php

Now, the usage is in my root index.php .

index.php

What I tried

o) used psr-4 like the following «xenframe\\hello»: «src/» .
o) used class paths, I don’t like this one because psr-4 is the recommended standard of composer.
o) using psr-0, I didn’t pick this one either as there was a lot of verbose.

1 Answer 1

While testing the given code, the problem was resolved by renaming index.php within src to App.php which relates to class name in the file. Also used «xenframe\\hello\\»: «src/» in psr-4 section in composer.json .

Also its worth mentioning that while composer was unable to autoload required class, due to PSR-4 non compliance, no error was reported by composer.

The problems were:

  1. The filename of class was not properly compliant with PSR-4 specifications. From section 2.3.3

The terminating class name corresponds to a file name ending in .php . The file name MUST match the case of the terminating class name.

Источник

PSR4 auto load without composer

I have one package in a project which is autoloaded using composer and composer.json entry is as follows :

Now I am copying this over to another project which is not using composer. How can I autoload this same package there ?

3 Answers 3

You have to read the composer and load the classes yourself for each namespaces defined into the composer.json .

Of course, I don’t know the classes you have in the PackageName. The /vendor/project is where your external library was cloned or downloaded. This is where you have the composer.json file.

Note: this works only for psr4 autoload.

EDIT : Adding support for multiple classpaths for one namespace

EDIT2 : I created a Github repo to handle this code, if anyone wants to improve it.

Читайте также:  Не работает один поворотник альфа

Yes, this question is 6months old, however I just used the following. I just found the following solution to the problem. I just locally ran the command composer dump-autoload -o in my project folder. After that I simply had to upload the contents of ./vendor/composer folder and the /vendor/autoload.php to the server and it worked again. This is helpful in case you cannot run composer on the server.

I am not a fan of Composer for many reasons. 1st reason shared hosting services do not offer composer as a package therefor it makes it harder to deliver low budget applications or simple MVC custom frameworks. Here is a work around that is compliant with PSR4 standards.

Assuming you add this auto-load method in a file in the root directory and that we are auto-loading classes for everything inside a folder called «src» here is how to archive this.

now in every file you should add a namespace and if you have a dependency the use. here is a basic example in

Also, all your folders inside src should start with a capital letter in my example.

Источник

composer имеет странное условие, в результате работает только autoload_static.php

Вопрос для знатоков.

Composer формирует autoload_real.php , где пишет

Всё бы хорошо, но я хочу использовать psr-4, а в результате следующего кода

я имею возможность работать только classmap.

Я с композером начинаю только работать, буду признателен, если разжуёте.

PS Самостоятельно искать пробовал.

В этом условии кроме всего прочего есть проверка на модуль zend_loader_file_encoded , которого у меня на моём виндовом апаче нет. Нужно было просто внимательнее прочитать. Поставил Линух, установил composer, который через apt install ставится непоследней версии, и всё работает (да даже если б и последняя — модуль zend_loader_file_encoded уже стоит в линуховой версии).

Поправьте, если я не прав! Надеюсь мой опыт будет полезен тем, кто столкнётся с этим!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками php composer или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.19.40496

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Оцените статью