为什么我需要通过 ssh 在 Homestead VM 中重新创建 composer autoloader?
Why I needed to recreate the composer autoloader inside the Homestead VM via ssh?
我的项目具有以下文件结构:
|- src
|-- PcMagas
|---- Dropbox.php
|---- DropBoxFactory.php
|- web
|-- index.php
并且 src 文件夹中的任何内容都会按照 PSR-4 的指示通过作曲家自动加载:
"autoload": {
"psr-4":{
"": "src/"
}
}
位于 src/PCMagas
的 class 的样本是:
namespace PCMagas;
use \GuzzleHttp\Client;
use PCMagas\Exceptions\FileNotFoundException;
class DropboxFactory
{
public static function fomeFunc()
{
//Do stuff
}
}
然后在 index.php
上,我使用 class 这样的:
require_once __DIR__ . '/../vendor/autoload.php';
use PCMagas\DropboxFactory;
DropboxFactory::fomeFunc();
虽然 Homestead 的 host 我通过以下方式启动我的应用程序:
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 启动时,出现以下错误:
Fatal error: Uncaught Error: Class 'PCMagas\DropboxFactory' not found in /home/vagrant/code/web/index.php
通过做:
vagrant ssh
之后:
cd ~/code
composer dump-autoload -o
工作得很好,但我仍然有以下问题:
- 为什么在
host
(Homestead-运行ning 虚拟机之外)classes 被自动加载而在内部却没有?是因为 ./vendor
文件夹是 .gitignore
d 吗?
- 如何在 Vm 设置中自动配置以自动加载 PSR-4 命名空间 classes?
after.sh
运行 是根用户还是非根用户 vagrant
我的应用程序位于 /home/vagrant/code
中?
对于问题 2
,您可以通过在项目的 after.sh
上放置以下代码来找出用户:
echo "I am user ${USER}"
和运行命令vagrant provision
如果输出是:
I am user vagrant
然后 after.sh
中的以下代码应该可以完成这项工作:
cd ~/code
composer install
composer dump-autoload -o
cd
第一个我还没有答案给你
我的项目具有以下文件结构:
|- src
|-- PcMagas
|---- Dropbox.php
|---- DropBoxFactory.php
|- web
|-- index.php
并且 src 文件夹中的任何内容都会按照 PSR-4 的指示通过作曲家自动加载:
"autoload": {
"psr-4":{
"": "src/"
}
}
位于 src/PCMagas
的 class 的样本是:
namespace PCMagas;
use \GuzzleHttp\Client;
use PCMagas\Exceptions\FileNotFoundException;
class DropboxFactory
{
public static function fomeFunc()
{
//Do stuff
}
}
然后在 index.php
上,我使用 class 这样的:
require_once __DIR__ . '/../vendor/autoload.php';
use PCMagas\DropboxFactory;
DropboxFactory::fomeFunc();
虽然 Homestead 的 host 我通过以下方式启动我的应用程序:
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 启动时,出现以下错误:
Fatal error: Uncaught Error: Class 'PCMagas\DropboxFactory' not found in /home/vagrant/code/web/index.php
通过做:
vagrant ssh
之后:
cd ~/code
composer dump-autoload -o
工作得很好,但我仍然有以下问题:
- 为什么在
host
(Homestead-运行ning 虚拟机之外)classes 被自动加载而在内部却没有?是因为./vendor
文件夹是.gitignore
d 吗? - 如何在 Vm 设置中自动配置以自动加载 PSR-4 命名空间 classes?
after.sh
运行 是根用户还是非根用户vagrant
我的应用程序位于/home/vagrant/code
中?
对于问题 2
,您可以通过在项目的 after.sh
上放置以下代码来找出用户:
echo "I am user ${USER}"
和运行命令vagrant provision
如果输出是:
I am user vagrant
然后 after.sh
中的以下代码应该可以完成这项工作:
cd ~/code
composer install
composer dump-autoload -o
cd
第一个我还没有答案给你