我想在控制器中运行不带shell命令的composer dump-autoload
在laravel 4中,我使用Artisan::call('dump-autoload');
但是在laravel 5中,这个命令不起作用。
Artisan不是composer
的包装器。Composer本身使用composer
命令来控制自己。
目前,无法从Artisan以适当的方式调用composer
命令,甚至无法使用php artisan make:console CommandName
创建自己的Artisan命令。
除非您不想使用PHPexec
或system
,我强烈建议您不要使用它们,否则最好单独运行composer dump-autoload
。
>=Laravel 5.0中没有Artisan::call('dump-autoload');
命令,但如果您仍然想使用此命令,并且不想将解决方案与exec
或system
一起使用,则需要通过以下方式创建自己的命令: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 AppConsoleCommands;
use IlluminateConsoleCommand;
use IlluminateFoundationComposer;
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 IlluminateFoundationComposer
*/
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');
您可以创建一个使用SymfonyComponentProcessProcess
的laravel命令,例如:
<?php
namespace AppConsoleCommands;
use IlluminateConsoleCommand;
use SymfonyComponentProcessExceptionProcessFailedException;
use SymfonyComponentProcessProcess;
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>";