在 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”未定义。
我在想这可能会发生。您可以将本机 php 与 exec
或 system
一起使用,或者更好地编写适当的工匠命令 .. 如官方 Laravel 文档中所述。请记住,exec
和 system
在托管系统上大多是被禁止的。
你能分享更多细节吗?你想通过这个实现什么?为什么不在部署您的应用程序时运行它?
【参考方案1】:
Artisan 不是 composer
的包装器。 Composer 本身自带composer
命令来控制自己。
目前无法从 Artisan 以 正确 的方式调用 composer
命令 - 即使使用 php artisan make:console CommandName
创建您自己的 Artisan 命令也是如此。
除非您不想使用我强烈不推荐的 PHP exec
或 system
,否则您最好单独运行 composer dump-autoload
。
【讨论】:
不使用exec
或system
也可以使用您自己的命令执行此操作,请查看我的答案。
对于 laravel 5.3 及以上版本使用php artisan make:command CommandName
【参考方案2】:
>= Laravel 5.0 中没有Artisan::call('dump-autoload');
命令,但是如果你仍然想使用这个命令并且不想使用exec
或system
的解决方案,你需要通过以下方式创建自己的命令:@ 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->composer->dumpAutoloads()
和$this->composer->dumpOptimized();
。 dumpOptimized
与 dumpAutoloads('--optimize')
相同【参考方案3】:
试试这个
system('composer dump-autoload');
【讨论】:
【参考方案4】:您可以运行它以获得更好的结果。它会给你像命令行一样的结果。
return "<pre>". shell_exec ('composer dump-autoload')."</pre>";
【讨论】:
请分享更多细节。为什么需要将结果包装在标记中?以上是关于在 laravel 5 中从控制器运行 composer dump-autoload的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 5 中从 Carbon 获取当前时间戳