manix
manix

Reputation: 14747

dump-autoload command from php

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:

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

Upvotes: 3

Views: 3919

Answers (3)

Hossein Azad
Hossein Azad

Reputation: 108

Okay, I solved it. What I did to solve this:

composer update

gave me the following error:

[Seld\JsonLint\ParsingException]

"./composer.json" does not contain valid JSON Parse error on line 9: "require-dev

Expected: 'STRING' - It appears you have an extra trailing comma I opened composer.json and there was one extra comma in last line:

"require": {
    "php": ">=8.1.0",
    "laravel/framework": "9.1.*",
}

Removed the comma so it looked like this:

"require": {
    "php": ">=8.1.0",
    "laravel/framework": "9.1.*"
}

And problem was gone.

Upvotes: 0

Rahil Wazir
Rahil Wazir

Reputation: 10132

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/

Upvotes: 3

redreinard
redreinard

Reputation: 2044

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.

Upvotes: 2

Related Questions