douzhiba6873
douzhiba6873
2014-05-16 20:36

来自php的dump-autoload命令

已采纳

I am building a web application where the user dynamically can upload Controllers php files from the web browser. There is a problem in all of this.

Since every class should be compiled in order be used inside of laravel, the commmand composer dump-autoload must be executed. But I do not want to do this manually from the terminal. Inside of a "register class" I have called explicitly some commands that have not worked for me, for example:

  • Artisan::call('dump-autoload');
  • exec("/path/to/app/composer dump-autoload");
  • shell_exec('php artisan dump-autoload');
  • shell_exec('composer dump-autoload');

The new controllers are still not being found. So, I do not know what I am missing. Or if there is another way to "load" my classes dynamically.

Things to consider:

  1. Security implications: of course, but my question is widely open to dynamically recognize new classes in execution time
  2. I am completely sure about paths, I have tested every issue from a linux terminal and all worked fine (with absolute and relative path). For these reasons, I look for another reason instead of paths.
  3. Don't forget to actually 'require' or 'include' the class after you compile it Sure, the file is included and confirmed by the point 2.
  4. This looks suspicious:

    my off-the-cuff guess would be that the user running php doesn't have sufficient privileges to perform the operation or write to the required directories

    However, how could it be possible that php doesn't have enough privileges, could be it affects the composer dump-autoclass command?

  5. Apache/2.4.9 (Fedora) PHP/5.5.12

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • donglao9606 donglao9606 7年前

    Well to work this out you can do this:

    exec("composer dump-autoload -d /path/to/laravel-project/");
    

    You have to explicitly tell composer where to look for composer.json.

    -d If specified use the given directory as working directory

    Without -d option, composer assumes your composer.json lives in path/to/laravel-project/public/. Because all requests are routed to front controller index.php and by that mean the current working directory is public/

    点赞 评论 复制链接分享
  • duandeng2011 duandeng2011 7年前

    There isn't really enough information here to help us help you.

    Things to consider:

    • just want to mention the horrible security implications
    • I'm not going to address path issues, just be sure they're complete and absolute
    • my off-the-cuff guess would be that the user running php doesn't have sufficient privileges to perform the operation or write to the required directories
    • don't forget to actually 'require' or 'include' the class after you compile it
    • make sure that your autoloader is actually firing, maybe with some logging or the like
    • make sure you don't have php safe mode enabled, and that you move the uploaded file before doing any work on it

    Try updating your question with some additional information if you can please.

    点赞 评论 复制链接分享

相关推荐