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

Posted

技术标签:

【中文标题】在 laravel 5 中从控制器运行 composer dump-autoload【英文标题】:Run composer dump-autoload from controller in laravel 5 【发布时间】:2016-09-11 08:03:18 【问题描述】:

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

【问题讨论】:

你试过Artisan::call('composer dump-autoload');吗?如果你想要一个真正的工匠命令,你需要让自己习惯于编写命令(laravel.com/docs/master/artisan#writing-commands) 命令“composer dump-autoload”未定义。 我在想这可能会发生。您可以将本机 phpexecsystem 一起使用,或者更好地编写适当的工匠命令 .. 如官方 Laravel 文档中所述。请记住,execsystem 在托管系统上大多是被禁止的。 你能分享更多细节吗?你想通过这个实现什么?为什么不在部署您的应用程序时运行它? 【参考方案1】:

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

目前无法从 Artisan 以 正确 的方式调用 composer 命令 - 即使使用 php artisan make:console CommandName 创建您自己的 Artisan 命令也是如此。

除非您不想使用我强烈不推荐的 PHP execsystem,否则您最好单独运行 composer dump-autoload

【讨论】:

不使用execsystem 也可以使用您自己的命令执行此操作,请查看我的答案。 对于 laravel 5.3 及以上版本使用php artisan make:command CommandName【参考方案2】:

>= Laravel 5.0 中没有Artisan::call('dump-autoload'); 命令,但是如果你仍然想使用这个命令并且不想使用execsystem 的解决方案,你需要通过以下方式创建自己的命令:@ 987654324@ 用于 Laravel 版本 > 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();
    

【讨论】:

适用于使用 laravel 5.5 及更高版本的用户。将 Use 改为使用 Illuminate\Support\Composer; 不要同时使用$this-&gt;composer-&gt;dumpAutoloads()$this-&gt;composer-&gt;dumpOptimized();dumpOptimizeddumpAutoloads('--optimize') 相同【参考方案3】:

试试这个

system('composer dump-autoload');

【讨论】:

【参考方案4】:

您可以运行它以获得更好的结果。它会给你像命令行一样的结果。

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

【讨论】:

请分享更多细节。为什么需要将结果包装在标记中?

以上是关于在 laravel 5 中从控制器运行 composer dump-autoload的主要内容,如果未能解决你的问题,请参考以下文章

Laravel-安装composer

Laravel 在控制台中从表中显示数组,即使具有空值

如何在 Laravel 5 中从 Carbon 获取当前时间戳

在 Laravel 中从同一网页发布两个表单

如何在 laravel 5.2 中从 url 中删除 public

在 laravel 应用程序中从 cmd 运行 gulp 时出错