У меня есть локальный проект с загруженными библиотеками Composer. Я загрузил этот проект на свой FTP и получил ошибки, связанные с не найденными классами от некоторых библиотек.
Могу ли я просто скопировать vendor/
папка на FTP или я что-то пропустил?
Ошибка получена:
Fatal error: Class 'AAA\Core\Tools' not found in /home/aaa/public_html/api.php on line 11
api.php
:
<?php
use AAA\Core\Tools;
require_once("./vendor/autoload.php");
require_once("./api/" . Tools::getFieldValue('controller') . ".php");
Все отлично работает на localhost
!
Linux имеет чувствительную к регистру файловую систему. Это означает, что файлы Alex.txt
а также alex.txt
то же самое в Windows, но не в Linux. На самом деле в Linux оба могут счастливо жить в одном каталоге:
$ tree .
.
├── alex.txt
└── Alex.txt
0 directories, 2 files
Принимая это во внимание, я бы попытался перепроверить, что пути, которые вы используете в вашем пространстве имен, фактически идентичны тем, которые находятся на уровне файловой системы. (то есть: AAA
справочник только с заглавными буквами; Core
каталог с большой буквы и Tools.php
файл с заглавной буквы)
Если вы хотите сохранить существующую структуру файловой системы, вы можете использовать PSR-4, чтобы явно указать Composer, как сопоставить пространство имен с файловой системой:
+ Изменить autoload
раздел из вашего composer.json:
{
"autoload": {
"psr-4": {"AAA\\DB\\": "db/"}
}
}
где db/
фактический путь из файловой системы
Обновите автозагрузчик:
$ composer dump-autoload
Это позаботится об именах каталогов, но не относится к файлам. Это означает, что любой файл внутри db/
должен быть назван точно так же, как используется в пространстве имен (для использования в качестве use AAA\DB\DBCore
файл должен быть db/DBCore.php
).
Если ваш файл называется dbcore.php
и вы хотите сослаться на это в своем пространстве имен как DBCore
, ты можешь использовать classmap особенность от композитора:
"autoload": {
"classmap": [
"db/dbcore.php"]
}
dbcore.php:
<?php
namespace AAA\DB;
class DBCore
{
}
И вы можете использовать его как обычно:
<?php
require_once("./vendor/autoload.php");
$dbCore = new \AAA\DB\DBCore();
Во-первых, я бы проверил, какие файлы автозагрузчика сгенерировал композитор, чтобы убедиться в правильности путей на вашем сервере Linux.
Другая простая, но распространенная проблема заключается в том, что в Windows имена папок и файлов не чувствительны к регистру, но в Linux. Дважды убедитесь, что папки и файлы имеют правильный регистр, как будто он не найдет их для автоматической загрузки.
Вместо того, чтобы пытаться загрузить через FTP, что, как я думаю, будет сложно, если не невозможно сделать правильно, я бы посоветовал вам изучить работу композитора в вашей хостинговой среде.
Composer полностью основан на PHP, поэтому должен работать везде, где работает PHP.
Если у вас нет доступа к командной строке, вы можете использовать что-то вроде PHPShell которая дает вам основанную на PHP командную строку, в которой вы можете запустить Composer.
Смотрите этот другой так ответ чтобы получить несколько советов о том, как использовать PHPShell.
Другой вариант — создать небольшую оболочку PHP, которую вы на самом деле запускаете, посещая ее в своем браузере классическим способом PHP. Посмотрите этот другой SO ответ на несколько советов о том, как это сделать.
В итоге, вы действительно должны посмотреть, как Composer работает на вашем сервере, а не пытаться использовать его по-другому.
После того, как вы выполнили процесс создания на сервере, вы должны удалить созданную вами оболочку PHPS или компоновщика, чтобы не оставить никаких брешей в безопасности.
Вы сказали композитору, где находится ваш класс AAA \ Core \ Tools?
Вы даже можете добавить свой собственный код в автозагрузчик, добавив поле автозагрузки> в composer.json.
{
"autoload": {
"psr-4": {"Acme\\": "src/"}
}
}
Composer не предназначен для такого использования (то есть вы не должны вручную переносить каталоги поставщиков из одной среды в другую).
При добавлении зависимостей в ваш проект файл composer.json будет содержать эти зависимости. Когда вы запускаете установку или обновление composer на своем локальном хосте, он «блокирует» текущую версию этих зависимостей для вашего проекта и сохраняет их в файле composer.lock. Вам следует перенести файлы composer.json и composer.lock из среды разработки в производственную среду, а затем запустить установку composer в производственной среде в рамках процесса развертывания. Когда вы запускаете установку composer в своей производственной среде, Composer просматривает ваш файл composer.lock и устанавливает указанные версии зависимостей в каталоге vendor в производственной среде.
Вы можете ознакомиться с документацией композитора относительно базового использования (https://getcomposer.org/doc/01-basic-usage.md) и параметры командной строки (https://getcomposer.org/doc/03-cli.md) Больше подробностей.