从php转储自动加载命令


dump-autoload command from php

我正在构建一个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');

仍然没有找到新的控制器。所以,我不知道我错过了什么。或者如果有另一种方式来动态"加载"我的类。

注意事项:

  1. 安全含义:当然,但是我的问题是在执行时间动态识别新类
  2. 我完全确定路径,我已经从linux终端测试了每个问题,所有工作都很好(绝对和相对路径)。由于这些原因,我寻找另一个原因而不是路径。
  3. Don't forget to actually 'require' or 'include' the class after you compile it当然,文件被包含并被第2点确认。
  4. 这看起来很可疑:

    我的猜测是运行PHP的用户没有足够的权限来执行操作或写入所需的目录

    然而,怎么可能php没有足够的权限,可能会影响composer dump-autoclass命令?

  5. 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.*"
}

问题就解决了