Поставщик Composer / папка FTP загрузка

У меня есть локальный проект с загруженными библиотеками 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!

2

Решение

Linux имеет чувствительную к регистру файловую систему. Это означает, что файлы Alex.txt а также alex.txt то же самое в Windows, но не в Linux. На самом деле в Linux оба могут счастливо жить в одном каталоге:

$ tree .
.
├── alex.txt
└── Alex.txt

0 directories, 2 files

Принимая это во внимание, я бы попытался перепроверить, что пути, которые вы используете в вашем пространстве имен, фактически идентичны тем, которые находятся на уровне файловой системы. (то есть: AAA справочник только с заглавными буквами; Core каталог с большой буквы и Tools.php файл с заглавной буквы)


Если вы хотите сохранить существующую структуру файловой системы, вы можете использовать PSR-4, чтобы явно указать Composer, как сопоставить пространство имен с файловой системой:

  1. + Изменить autoload раздел из вашего composer.json:

    {
    "autoload": {
    "psr-4": {"AAA\\DB\\": "db/"}
    }
    }
    

    где db/ фактический путь из файловой системы

  2. Обновите автозагрузчик:

    $ 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();
3

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

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

Другая простая, но распространенная проблема заключается в том, что в Windows имена папок и файлов не чувствительны к регистру, но в Linux. Дважды убедитесь, что папки и файлы имеют правильный регистр, как будто он не найдет их для автоматической загрузки.

2

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

Composer полностью основан на PHP, поэтому должен работать везде, где работает PHP.

Если у вас нет доступа к командной строке, вы можете использовать что-то вроде PHPShell которая дает вам основанную на PHP командную строку, в которой вы можете запустить Composer.

Смотрите этот другой так ответ чтобы получить несколько советов о том, как использовать PHPShell.

Другой вариант — создать небольшую оболочку PHP, которую вы на самом деле запускаете, посещая ее в своем браузере классическим способом PHP. Посмотрите этот другой SO ответ на несколько советов о том, как это сделать.

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

После того, как вы выполнили процесс создания на сервере, вы должны удалить созданную вами оболочку PHPS или компоновщика, чтобы не оставить никаких брешей в безопасности.

1

Вы сказали композитору, где находится ваш класс AAA \ Core \ Tools?

Вы даже можете добавить свой собственный код в автозагрузчик, добавив поле автозагрузки> в composer.json.

{
"autoload": {
"psr-4": {"Acme\\": "src/"}
}
}
0

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) Больше подробностей.

0
По вопросам рекламы [email protected]