2016-03-31 11 views
0

ist es möglich, Composer oder Git-Befehle aus einem Controller in Laravel ausführen? Etwas wie das:Laravel run Composer/Git Befehle in Controller

class TestController extends Controller 
{ 
    // 
    public function shell(Request $request){ 
     if($request->isMethod('post')){ 


      $data['output'] = shell_exec('composer update'); 
      // or some git commands 
      return view('tests.shell', $data); 
     } else { 
      return view('tests.shell'); 
     } 
    } 
} 

Wenn ich es wie oben gezeigt mache, bekomme ich keine Nachricht. Ich denke, das Problem ist, dass diese Befehle im Root-Verzeichnis des Projekts und nicht in einem Unterordner ausgeführt werden müssen.

Und gibt es eine PHP-Funktion, um ein komplettes Shell-Skript und nicht nur einzelne Befehle auszuführen?

Ich habe dies getestet:

echo shell_exec('php ' . __DIR__ . '/../shell.php'); 
// shell.php is in projects root directory 

Das Skript ausgeführt wird, aber nicht im Stammverzeichnis.

Danke!

Antwort

1

Ich habe es vorher nicht bemerkt, aber Laravel Schiffe mit einem Werkzeug Terminal-Befehle/Komponist Befehle auszuführen. Sie können die The Process Component von Symfony verwenden. So wird es sehr einfach, Befehle auszuführen.

Ein Beispiel für Laravel 5.2:

namespace App\Http\Controllers; 

use Illuminate\Database\Eloquent\ModelNotFoundException; 
use Illuminate\Http\Request; 

use App\Http\Requests; 

use Symfony\Component\Process\Process; 
use Symfony\Component\Process\Exception\ProcessFailedException; 

class SetupController extends Controller 
{ 
    public function setup(){ 
     $migration = new Process("php artisan migrate"); 

     $migration->setWorkingDirectory(base_path()); 

     $migration->run(); 

     if($migration->isSuccessful()){ 
      //... 
     } else { 
      throw new ProcessFailedException($migration); 
     } 
    } 
} 
1

Sie können so etwas wie dies versuchen:

$data['output'] = shell_exec('(cd '. base_path() .' && /usr/local/bin/composer info)'); 

// debug 
dd($data); 

Der Befehl in ist ( und ) so dass wir Modus in den Stammordner, wenn das Projekt und die composer info auszuführen.

Der folgende git Befehl auch funktioniert auch, aber nicht git pull oder git fetch:

$data['output'] = shell_exec('(cd '. base_path() .' && /usr/bin/git status)') 

Ich habe auch versucht, den /usr/local/bin/composer update Befehl, aber wie Sie warten, bis die Pakete um das Skript zu aktualisieren, entweder zurück null oder Zeitüberschreitung.

Es ist auch erwähnenswert, dass der vollständige Pfad zu Composer/Git verwendet werden sollte, d. H. /usr/local/bin/composer oder Sie werden immer null zurückgegeben.

Für Ihre PHP-Skript, versuchen Sie etwas Ähnliches wie:

echo shell_exec('(cd '. base_path() .' && php shell.php)'); 

EDIT

Wenn Sie die Ausgabe des Befehls protokollieren wollen Datei und in PHP zu erfassen zu versuchen, Sie können versuchen:

$data['output'] = shell_exec('(cd '. base_path() .' && /usr/bin/git status | tee -a file.log)') 

Die tee -a file.log Teil ausgegeben zu file.log sowie Ausgabe auf dem Bildschirm speichern (so shell_exec kann Pickup-Ausgang) und die -a Flag neue Ausgabe an die Datei anhängen, wenn es bereits vorhanden ist (nützlich, wenn Sie eine Protokolldatei, um mit historischen Aufzeichnungen wollen von vorherige Befehle).

+0

Alles funktioniert in meinem lokalen Umfeld in Ordnung. Aber ich habe keinen Erfolg in meiner Laravel-Installation. Das Ergebnis ist NULL.Ich habe auch versucht, andere Befehle als composer/git auszuführen (z. B. php artisan make: controller XyzController), aber ohne Erfolg ... – Brotzka

+0

Ich hatte auch gemischte Ergebnisse. Einige Befehle funktionieren perfekt, während andere '' 'null''' zurückgeben. Könnte mit der Art der Ausgabe zusammenhängen, die durch den Befehl oder PHP-Zeitablauf erzeugt wird ... –

+0

Kennen Sie eine Möglichkeit, die Aktionen zu protokollieren? Es ist schwierig zu überprüfen, ob ein Befehl erfolgreich war oder nicht, wenn es keine Ausgabe gibt ^^ – Brotzka