我希望在控制器中不使用shell命令运行composer dump-autoload
。
在laravel 4中,我使用Artisan::call('dump-autoload');
但是在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命令也不行。
除非你不想使用PHP的exec
或system
,但我强烈不建议这样做,最好单独运行composer dump-autoload
。
exec
或 system
,请查看我的答案。 - Marek Skibaphp artisan make:command CommandName
。 - Furqan Ansari在Laravel 5.0及以上版本中没有Artisan::call('dump-autoload');
命令,但如果您仍想使用该命令并且不想使用exec
或system
的解决方案,您需要通过以下方式创建自己的命令:php artisan make:console DumpAutoload
(适用于Laravel版本> 5.3)。然后,您需要将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();
}
}
$this->composer->dumpAutoloads()
和 $this->composer->dumpOptimized();
。dumpOptimized
等同于 dumpAutoloads('--optimize')
。 - Erin试试这个
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>";
Artisan::call('composer dump-autoload');
吗?如果你想要一个_真正的_ artisan 命令,你需要熟悉编写命令 (https://laravel.com/docs/master/artisan#writing-commands)。 - codedgeexec
或system
,或者更好的方法是编写一个合适的artisan命令..正如Laravel官方文档所描述的那样。 请记住,在托管系统上,exec
和system
大多是被禁止的。 - codedge