2015-08-07 4 views
2

У меня есть локальный проект с загрузкой Composer libs. Я загрузил этот проект на свой FTP и получил ошибки, связанные с не найденными классами из некоторых библиотек.Composer vendor/folder FTP upload

Могу я просто скопировать 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!

+0

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

+0

@Brad Дополнительная информация предоставлена, спасибо! –

+1

Вы запустили команду 'install' после загрузки? –

ответ

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. Update автозагрузчика:

    $ composer dump-autoload 
    

Это будет заботиться о именах каталогов, но не применяется для файлов ,Это означает, что любой файл внутри db/ должен быть назван точно так же, как используется в пространстве имен (для использования как use AAA\DB\DBCore файл должен быть db/DBCore.php).

Если файл называется dbcore.php, и вы хотите, чтобы ссылаться на него в пространстве имен, как DBCore, вы можете использовать функцию classmap из Composer:

"autoload": { 
    "classmap": [ 
     "db/dbcore.php" 
    ] 
} 

dbcore.php:

<?php 

namespace AAA\DB; 

class DBCore 
{ 
} 

И ты может использовать его, как обычно:

<?php 
require_once("./vendor/autoload.php"); 
$dbCore = new \AAA\DB\DBCore(); 
+0

Могу ли я как-то псевдонимы имена папок в верхнем регистре в пространствах имен, например, у меня есть папка 'db /', но вы хотите использовать ее как 'use AAA \ DB \ DBCore'? –

+1

@DmytroZarezenko Посмотрите, поможет ли мое обновление. –

0

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

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

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

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

2

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

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

+0

Могу ли я как-то псевдонимы имена папок в верхнем регистре в пространствах имен, например, у меня есть папка 'db /', но вы хотите использовать ее как 'use AAA \ DB \ DBCore'? –

+1

Вы должны быть в состоянии сделать это в своем composer.json, как рассказал Александру в своем ответе. – Neddage

0

Композитор не предназначен для использования таким образом (т. вам не следует вручную переносить каталоги поставщиков из одной среды в другую).

Поскольку вы добавляете зависимости к вашему проекту, файл composer.json будет содержать эти зависимости. Когда вы запускаете компоновку установки или обновления на своем локальном хосте, она «блокирует» текущую версию этих зависимостей для вашего проекта и сохраняет их в файле composer.lock. Вам необходимо передать файлы composer.json и composer.lock из среды разработки в рабочую среду, а затем запустить установку композитора в рабочей среде в рамках процесса развертывания. Когда вы запускаете установку композитора в рабочей среде, Composer будет смотреть на ваш файл composer.lock и устанавливать указанные версии зависимостей в каталоге поставщика рабочей среды.

Возможно, вы захотите ознакомиться с документацией композитора относительно базового использования (https://getcomposer.org/doc/01-basic-usage.md) и параметрами командной строки (https://getcomposer.org/doc/03-cli.md).

+1

На самом деле композитор - это просто менеджер зависимостей, и его цель заканчивается. Что бы вы ни делали после установки ваших зависимостей, это не проблема Composer. Некоторые люди предпочитают получать свои зависимости во время развертывания, используя 'comper install ', а другие предпочитают или вынуждены упаковывать все (_no ssh-доступ, shareware-проект, доставлять клиенту и т. Д.) До _pushing до production_. Реальная проблема заключается в том, когда Composer используется для чего-то, для которого не предназначено, например, для установки зависимостей NPM и Bower. –

+0

На самом деле композитор делает больше, чем просто управление зависимостями. 'comper install' будет генерировать автозагрузчик (с которым у вас возникли проблемы) и запустить другие скрипты, определенные в файле composer.json. См. «Параметры» в команде [install] [1]. Вы пытались запустить 'comper install' в рабочей среде, чтобы проверить, исправляет ли она вашу проблему? [1]: https://getcomposer.org/doc/03-cli.md#install – iDimensionz

+1

(_I не задавал вопрос. Пожалуйста, обратите больше внимания.) Функция скриптов позволяет вам перехватывать и изменять некоторые поведение Composer в заданных точках жизненного цикла выполнения, поэтому это расширение для управления зависимостями, которое имеет много зависимостей и менеджеров пакетов. Что касается автозагрузчика, он предлагает сопоставление между тем, что _crazy stuff_ любой автор делает на уровне файловой системы и что-то, что можно использовать внутри языка. Вы можете использовать его, или вы можете в любое время заменить его своим. –

1

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

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

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

See this other SO answer, чтобы получить несколько советов о том, как использовать PHPShell.

Другой вариант - создать небольшую оболочку PHP, которую вы фактически запускаете, посетив ее в своем браузере, в классическом PHP-способе. See this other SO answer for some tips on how to do that.

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

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