2015-11-10 3 views
0

Я относительно новичок в использовании композитора и автозагрузки для организации своего кода. У меня есть репозиторий git и на моей локальной машине, я создал композитор в корневом каталоге моего проекта. Я определил все в композиторе.json, нужно было бежать. Используя «composer install», все библиотеки автоматически устанавливаются.Автозагрузка композитора не будет работать после развертывания

{ 
    "name": "my/repo", 
    "description": "bla", 
    "version": "1.2.3", 
    "require": 
    { 
     "php": "5.6.*", 
     "geraintluff/jsv4": "1.*", 
     "lcobucci/jwt": "^3.0" 
    }, 
    "autoload": 
    { 
     "psr-4": 
     { 
      "MyNamespace\\": "src/" 
     } 
    } 
} 

Так что - когда я побежал «composer install» на моей локальной машине, все было в моей автозагрузке коды. Хорошо.

Но теперь мне нужно развернуть все это на другой Linux-системе. Поэтому я вытаскиваю из git и запускаю composer install. Все библиотеки загружены и файл автозагрузки отображается в vendor/

Однако я не могу использовать автозагрузку (да, я сделал require_once(__DIR__ . '/../vendor/autoload.php');). Everytime я пытаюсь instantiaze класса, я получаю

PHP Fatal error: Class 'X' not found in /var/www/bla/x.class.php on line 123 

Использование use X; не решает проблему, а также не пытается создать экземпляр класса с полным именем пространства имен (например, $x = new \A\B\X();)

Вот папка структура (если это имеет значение):

+ src/ 
| + X.class.php // namespace here is "MyNamespace" 
| + Y.class.php // same namespace 
+ test/ 
    + run.php // namespace is "Test" 

Вот отрывок из этого кода (run.php):

<?php namespace Test; // different namespace than the rest of the code 
// making the namespace also "\MyNamespace" wouldnt work either 

require_once(__DIR__ . '/../vendor/autoload.php'); 

use \MyNamespace\Y; // whether this line is here or not does not change the error 

session_start(); 

// same error as with "just" implements Y {} 
class SomeClass implements \MyNamespace\Y { 
    // ... 
} 

?> 

Итак, здесь возникает фатальная ошибка для линии, где Y расширен. Независимо от того, использую ли я полное пространство имен или нет. Единственное, что поможет, - require_once() ...

Итак, это заставляет меня вернуться к громоздкому способу выполнения всех требований/включает меня !? Есть ли способ решить это?

PS: composer dumpautoload не поможет

PPS: composer validate не показывает никаких ошибок

+0

Публикация фрагмента кода PHP, который дает вам эту ошибку, поможет устранить неполадки. – wogsland

+0

Кроме того, сообщение об ошибке 'composer.json', ответственное за автозагрузку класса, необходимо для оценки любых ошибок. – Sven

+0

Спасибо, что ответили, но это уже было решено. Композитор.json также уже указан выше – Xenonite

ответ

1

Для соответствия PSR-4, ваша файловая структура должна быть:

+ src/ 
| + X.php 
| + Y.php 

Примечание удаление .class. php суффикс. http://www.php-fig.org/psr/psr-4/

+0

Ну, это может быть правдой из-за спецификации, но ничего не решило :( – Xenonite

+0

WOW - просто потратил 1 полный час реструктуризации кода, чтобы он соответствовал указанной спецификации в каждом один бит, и он решил ... НИЧЕГО> :( – Xenonite

+0

Ну, даже если его не работает (пока), чтобы ваш код соответствовал спецификации PSR-4, все еще требуется использовать автозагрузчик PSR-4. Другие файлы: linux is case но Mac OS (если это то, что вы используете) файловой системы нет, поэтому, если ваш класс «X», а ваш файл «x.php», он будет работать на вашем Mac, но не на производстве. Объявляются ли оба из ваших классов чтобы быть в пространстве имен «MyNamespace»? Существует множество способов, с помощью которых ваша текущая настройка может не работать, а не отслеживать ее (не просматривая код). Я сделал [простой рабочий пример здесь] (http:// липкая.gl/4y9aqU) – jpschroeder

Смежные вопросы