在Laravel 5中从控制器运行composer dump-autoload。

5

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


1
你尝试过 Artisan::call('composer dump-autoload'); 吗?如果你想要一个_真正的_ artisan 命令,你需要熟悉编写命令 (https://laravel.com/docs/master/artisan#writing-commands)。 - codedge
命令“composer dump-autoload”未定义。 - paranoid
我在想这可能会发生。你可以使用本地的php与 execsystem,或者更好的方法是编写一个合适的artisan命令..正如Laravel官方文档所描述的那样。 请记住,在托管系统上,execsystem 大多是被禁止的。 - codedge
你能分享更多细节吗?你希望通过这个实现什么?为什么不在部署应用程序时运行它? - Nico Haase
5个回答

12

Artisan不是composer的包装器。 Composer本身提供了composer命令来控制自身。

目前还没有一种“合适”的方法可以从Artisan中调用composer命令 - 即使使用php artisan make:console CommandName创建自己的Artisan命令也不行。

除非你不想使用PHP的execsystem,但我强烈不建议这样做,最好单独运行composer dump-autoload


有一种方法可以用自己的命令来实现,而不需要使用 execsystem,请查看我的答案。 - Marek Skiba
对于 Laravel 5.3 及以上版本,请使用 php artisan make:command CommandName - Furqan Ansari

11

在Laravel 5.0及以上版本中没有Artisan::call('dump-autoload');命令,但如果您仍想使用该命令并且不想使用execsystem的解决方案,您需要通过以下方式创建自己的命令: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();
    }
}

4
对于使用 Laravel 5.5 及更高版本的用户,请将 Use 更改为 use Illuminate\Support\Composer; - Wim Pruiksma
不要同时执行 $this->composer->dumpAutoloads()$this->composer->dumpOptimized();dumpOptimized 等同于 dumpAutoloads('--optimize') - Erin

8

试试这个

system('composer dump-autoload');

0
你可以创建一个使用 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());
        }
    }    
}

-2

你可以运行这个程序以获得更好的结果。它会像命令行一样给出你的结果。

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

请分享更多详细信息。为什么需要用标记包装结果? - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接