我正在构建一个web应用程序,用户可以动态地从web浏览器上传控制器php文件。这一切都有一个问题。
由于每个类都应该按照在laravel中使用的顺序编译,因此必须执行命令composer dump-autoload
。但我不想从终端手动执行此操作。在"注册类"内部,我显式地调用了一些对我不起作用的命令,例如:
-
Artisan::call('dump-autoload');
-
exec("/path/to/app/composer dump-autoload");
-
shell_exec('php artisan dump-autoload');
-
shell_exec('composer dump-autoload');
仍然没有找到新的控制器。所以,我不知道我错过了什么。或者如果有另一种方式来动态"加载"我的类。
注意事项:
- 安全含义:当然,但是我的问题是在执行时间动态识别新类
- 我完全确定路径,我已经从linux终端测试了每个问题,所有工作都很好(绝对和相对路径)。由于这些原因,我寻找另一个原因而不是路径。
-
Don't forget to actually 'require' or 'include' the class after you compile it
当然,文件被包含并被第2点确认。 -
这看起来很可疑:
我的猜测是运行PHP的用户没有足够的权限来执行操作或写入所需的目录
然而,怎么可能php没有足够的权限,可能会影响
composer dump-autoclass
命令? -
Apache/2.4.9 (Fedora) PHP/5.5.12
你可以这样做:
exec("composer dump-autoload -d /path/to/laravel-project/");
你必须明确地告诉composer在哪里寻找composer.json
。
-d
如果指定,使用给定的目录作为工作目录
如果没有-d
选项,composer会假设composer.json
位于path/to/laravel-project/public/
中。因为所有的请求都被路由到前端控制器index.php
,也就是说当前的工作目录是public/
这里没有足够的信息来帮助我们帮助你。
注意事项:
- 只想提一下可怕的安全隐患
- 我不打算解决路径问题,只要确保它们是完整和绝对的
- 我的猜测是运行php的用户没有足够的权限来执行操作或写入所需的目录
- 不要忘记在编译后实际'require'或'include'这个类
- 确保你的自动加载器实际上正在发射,也许有一些日志记录或类似的
- 确保你没有启用php安全模式,并且在对其进行任何操作之前移动上传的文件
如果可以的话,试着用一些额外的信息来更新你的问题。
好了,我解决了。我是怎么解决这个问题的:
composer update
给了我以下错误:
[Seld JsonLint ParsingException]
"。/composer.json"不包含有效的JSON解析第9行错误:"require-dev
Expected: 'STRING' -看起来你有一个额外的逗号我打开了作曲家。Json,最后一行多了一个逗号:
"require": {
"php": ">=8.1.0",
"laravel/framework": "9.1.*",
}
去掉逗号,变成这样:
"require": {
"php": ">=8.1.0",
"laravel/framework": "9.1.*"
}
问题就解决了