Почему мне нужно было воссоздать автозагрузчик composer внутри Homestead VM через ssh?

#php #vagrant #homestead #psr-4

#php #vagrant #homestead #psr-4

Вопрос:

Мой проект имеет следующую файловую структуру:

 |- src
|-- PcMagas
|---- Dropbox.php
|---- DropBoxFactory.php
|- web
|-- index.php
  

И все, что находится в папке src, загружается автоматически, как предписывает PSR-4, через composer:

    "autoload": {
        "psr-4":{
            "": "src/"
        }
    }
  

Пример класса, расположенного в src/PCMagas , является:

 namespace PCMagas;

use GuzzleHttpClient; 
use PCMagasExceptionsFileNotFoundException;

class DropboxFactory
{
    public static function fomeFunc()
    {
       //Do stuff
    }
}
  

И на index.php я использую класс таким образом:

 require_once __DIR__ . '/../vendor/autoload.php';
use PCMagasDropboxFactory;
DropboxFactory::fomeFunc();
  

Пока на хосте Homestead я запускаю свое приложение через:

 composer dump-autoload -o
cd ^project_root^/web
php -S localhost:8990
  

Выходные данные команд являются:

 $ composer dump-autoload -o

No composer.json in current directory, do you want to use the one at /home/pcmagas/Kwdikas/php/apps/datawise? [Y,n]? Y
Generating optimized autoload files
  

И для php -S localhost:8990 является:

 PHP 7.0.33-0ubuntu0.16.04.3 Development Server started at Mon Apr 22 15:46:06 2019
Listening on http://localhost:8990
Document root is /home/pcmagas/Kwdikas/php/apps/datawise/web
Press Ctrl-C to quit.
  

И никаких проблем вообще. Но когда я пытаюсь запустить через homestead, я получаю следующую ошибку:

Неустранимая ошибка: Неперехваченная ошибка: класс ‘PCMagas DropboxFactory’ не найден в /home/vagrant/code/web/index.php

Через выполнение:

 vagrant ssh
  

И после:

 cd ~/code
composer dump-autoload -o
  

Сработало как шарм, но все же у меня есть следующие вопросы:

  1. Почему на host (за пределами виртуальной машины, работающей на Homestead) классы загружаются автоматически, а внутри нет? Это потому ./vendor , что папка является .gitignore общей?
  2. Как я могу автоматически настроить порядок при настройке виртуальной машины для автоматической загрузки классов с пространством имен PSR-4? after.sh Запускается ли он от имени пользователя root или vagrant от имени пользователя, не имеющего root, который /home/vagrant/code находится в моем приложении?

Комментарии:

1. Можете ли вы попробовать это, пожалуйста cd ^project_root^ composer dump-autoload -o php -S localhost:8990

2. Веб-страница загружается из web папки.

3. Добавлен вывод к отредактированному ответу.

Ответ №1:

Для вопроса 2 вы можете узнать пользователя, разместив в своем проекте after.sh следующий код:

 echo "I am user ${USER}"
  

И запустите команду vagrant provision , если вывод:

Я пользователь vagrant

Тогда следующий фрагмент кода в after.sh должен выполнить эту работу:

 cd ~/code
composer install
composer dump-autoload -o
cd
  

На первый вопрос у меня все еще нет ответа, чтобы дать вам.