从laravel 5中的控制器运行composer dump autoload


Run composer dump-autoload from controller in laravel 5

我想在控制器中运行不带shell命令的composer dump-autoload
在laravel 4中,我使用Artisan::call('dump-autoload');
但是在laravel 5中,这个命令不起作用。

Artisan不是composer的包装器。Composer本身使用composer命令来控制自己。

目前,无法从Artisan以适当的方式调用composer命令,甚至无法使用php artisan make:console CommandName创建自己的Artisan命令。

除非您不想使用PHPexecsystem,我强烈建议您不要使用它们,否则最好单独运行composer dump-autoload

>=Laravel 5.0中没有Artisan::call('dump-autoload');命令,但如果您仍然想使用此命令,并且不想将解决方案与execsystem一起使用,则需要通过以下方式创建自己的命令:php artisan make:console DumpAutoload for Laravel version>5.3(您需要在app/Console/Kernel.php中向$commands数组添加新命令)。然后,您需要将Composer类注入到新的命令构造中:

public function __construct(Composer $composer)
{
    parent::__construct();
    $this->composer = $composer;
}

然后可以在handle()方法中运行dumpAutoloads()

public function handle()
{
    $this->composer->dumpAutoloads();
}

检查vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php中的类MigrateMakeCommand,有一个使用它的命令示例

<?php
namespace App'Console'Commands;
use Illuminate'Console'Command;
use Illuminate'Foundation'Composer;
class DumpAutoload extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'dump-autoload';
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Regenerate framework autoload files';
    /**
     * The Composer instance.
     *
     * @var 'Illuminate'Foundation'Composer
     */
    protected $composer;
    /**
     * Create a new command instance.
     *
     * @param Composer $composer
     * @return void
     */
    public function __construct(Composer $composer)
    {
        parent::__construct();
        $this->composer = $composer;
    }
    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        $this->composer->dumpAutoloads();
        $this->composer->dumpOptimized();
    }
}

试试这个

system('composer dump-autoload');

您可以创建一个使用Symfony'Component'Process'Process的laravel命令,例如:

<?php
namespace App'Console'Commands;
use Illuminate'Console'Command;
use Symfony'Component'Process'Exception'ProcessFailedException;
use Symfony'Component'Process'Process;
class ComposerDumpAutoloadCommand extends Command
{
    protected $name = 'composer:dump-autoload';
    protected $description = 'Run composer dump-autoload';
    public function handle()
    {
        $this->dump_autoload();
    }
    private function dump_autoload()
    {
        $process = new Process(['composer', 'dump-autoload', '-o']);
        $process->setTimeout(null);
        try {
            $process->mustRun();
            $this->info($process->getOutput());
        } catch (ProcessFailedException $e) {
            $this->error($e->getMessage());
        }
    }    
}

您可以运行它以获得更好的结果。它会给出类似命令行的结果。

 return  "<pre>". shell_exec ('composer dump-autoload')."</pre>";