2015-12-14 1 views
8

Ich habe einen Konsolenbefehl in console/controllers mit SuggestionController erstellt.So führen Sie den Konsolenbefehl in yii2 aus dem Web

Wenn ich Befehl wie php yii suggestions ausführen, funktioniert es.

Ich möchte wissen, wie Konsolenbefehl aus dem Web ohne Erweiterungen von yii2 ausführen.

+0

Vielleicht versuchen 'exec()', aber es ist im Allgemeinen schlechte Idee. – ineersa

+0

https://github.com/toriphes/yii2-console-runner macht genau das, was Sie brauchen. – ineersa

+0

Mögliches Duplikat von [Wie kann ich einen Konsolenbefehl in der Webanwendung in Yii 2.0 aufrufen] (http: // stackoverflow.com/questions/25355483/how-can-ich-call-a-konsole-befehl-in-web-application-in-yii-2-0) – SilverFire

Antwort

1

Sie können entweder exec() Ihren Befehl'''php yii suggestions''', aber dies kann zu Berechtigungsproblemen mit dem Webserver-Benutzer führen.

Der bessere Weg ist die Verwendung einer ConsoleRunner-Erweiterung, z. yii2-console-runner oder yii2-console-runner-extension, die den Auftrag Job Job ein wenig anspruchsvoller und sicherer mit popen().

Achten Sie bei der Ausführung von exec() und dergleichen immer auf Code-Injektionen!

+0

Was ist los mit dieser Antwort? – WeSee

+0

Jetzt läuft es auf Root Folter. also wie kann ich in einem anderen Ordner ausführen. – dungphanxuan

+1

Ich setze chdir ('Ordner'); also es ist Arbeit, danke – dungphanxuan

2

So habe ich vor einiger Zeit gefunden und verwendet, um yii console controller/action auszuführen (ich benutzte dies für Laufmigrationen aus dem Web).

In Ihrem Web-Controller-Aktion:

// default console commands outputs to STDOUT 
// so this needs to be declared for wep app 
if (! defined('STDOUT')) { 
    define('STDOUT', fopen('/tmp/stdout', 'w')); 
} 

$consoleController = new \yii\console\controllers\SuggestionController; 
$consoleController->runAction('your action eg. index'); 

/** 
* open the STDOUT output file for reading 
* 
* @var $message collects the resulting messages of the migrate command to be displayed in a view 
*/ 
$handle = fopen('/tmp/stdout', 'r'); 
$message = ''; 
while (($buffer = fgets($handle, 4096)) !== false) { 
$message .= $buffer . "\n"; 
} 
fclose($handle); 

return $message; 
4

Es kann viel einfacher

$oldApp = \Yii::$app; 
new \yii\console\Application([ 
    'id' => 'Command runner', 
    'basePath' => '@app', 
    'components' => [ 
     'db' => $oldApp->db, 
    ], 
); 
\Yii::$app->runAction('migrate/up', ['migrationPath' => '@yii/rbac/migrations/', 'interactive' => false]); 
\Yii:$app = $oldApp; 

Github LINK

0

getan werden, ich denke, das ist die einfachste Lösung ist:

$controller = new SuggestionController(Yii::$app->controller->id, Yii::$app); 
$controller->actionSuggestions(); 
0

Ab Yii2 - 2.0.11.2 erweiterte app - das funktioniert

Zunächst ist sicher Controller und Namespace richtig machen lassen. In diesem Fall Frontend Zugriff app Konsolenanwendung import-Methode()

In Konsole \ \ Controller FhirController

enter image description here

Stellen des Alias ​​in der Konsole zur Verfügung steht \ config \ main.php [Optional]

enter image description here

'aliases' => [ 
    '@common' => dirname(__DIR__), 
    '@frontend' => dirname(dirname(__DIR__)) . '/frontend', 
    '@backend' => dirname(dirname(__DIR__)) . '/backend', 
    '@console' => dirname(dirname(__DIR__)) . '/console', 
], 

schließlich vom Frontend-Ansicht, um den Anruf wie folgt machen: In diesem Fall wird die Steuerung Route Fhir dann Methode Import Aufruf()

$consoleController = new console\controllers\FhirController('fhir', Yii::$app); 
$consoleController->runAction('import');