Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run composer dump-autoload from controller in laravel 5

I want to run composer dump-autoload without shell command in controller.
In laravel 4 I use Artisan::call('dump-autoload');
but in laravel 5 this command not work.

like image 697
paranoid Avatar asked May 15 '16 12:05

paranoid


2 Answers

Artisan is not wrapper for composer. Composer itself brings the composer command to control itself.

Currently there is no way to call composer commands in a proper way from Artisan - not even with creating your own Artisan command with php artisan make:console CommandName.

Unless you don't want to use PHPs exec or system, which I highly do not recommend, you better run composer dump-autoload on its own.

like image 174
codedge Avatar answered Sep 28 '22 06:09

codedge


There is no Artisan::call('dump-autoload'); command in >= Laravel 5.0, but if you still want to use this command and don't want use solutions with exec or system, you need create your own command by: php artisan make:console DumpAutoload for Laravel version > 5.3 (You need add new command to $commands array in app/Console/Kernel.php). Then you need inject Composer class to you new command construction:

public function __construct(Composer $composer)
{
    parent::__construct();

    $this->composer = $composer;
}

and then you can run dumpAutoloads() in handle() method:

public function handle()
{
    $this->composer->dumpAutoloads();
}

Check class MigrateMakeCommand in vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php there is an example command that use it. Here you have my command:

<?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();
    }
}
like image 44
Marek Skiba Avatar answered Sep 28 '22 07:09

Marek Skiba