2015-10-29 11 views
6

Ich habe zwei verschiedene Yii2 Konsolenbefehle/Controller erstellt.Yii2 - Rufen Sie einen Yii-Konsolenbefehl aus einem anderen Konsolenbefehl heraus auf?

Beispiel, sie zu nennen ist

# yii user/create-account 

und

# yii webserver/update-config 

Nach Benutzer/create-Konto betreibe ich Webserver/update-config aufgerufen werden soll - ist es möglich, diese von innen Yü tun nach Code? Oder muss ich exec()/system() verwenden, um extern das zweite yii php-Skript aufzurufen (würde ich lieber nicht).

Jede Hilfe/Einsicht wäre willkommen!

+0

finden dies vielleicht hilfreich: https://github.com/vova07/yii2-console- runner-extension –

Antwort

7

Nach einiger Überlegung wählte ich die Methode runAction des Controllers (die auch von den Yii-Entwicklern empfohlen wird).

Beispiel für eine Konsolenanwendung:

\Yii::$app->runAction('webserver/update-config'); 

Es ist auch möglich params zu übergeben, indem eine Anordnung in als zweiten Parameter.

Ein Beispiel für einfache Parameter:

\Yii::$app->runAction('webserver/update-config', array('oneValue','anotherValue'); 

Hier ein Beispiel für benannte Parameter:

\Yii::$app->runAction('webserver/update-config', array('servertype'=>'oneSetting', 'serverdir'=>'anotherSettingValue') 

Bitte beachten Sie, dass dies die Steuerung ein Teil des anrufenden Code aufgerufen macht. Wenn der aufgerufene Controller aus irgendeinem Grund fehlschlägt, schlägt das gesamte Programm fehl. Gute Fehlerbehandlung ist ein Muss. Im aufgerufenen Controller können Sie den Fehlercode zurücksetzen, indem Sie return verwenden.

Beispiel:

Berufung Codezeile:

$iExitCode=\Yii::$app->runAction('webserver/update-config', array('oneValue','anotherValue'); 

Called Controller:

<?php 
namespace app\commands; 

use yii\console\Controller; 

/** 
* Webserver related functions 
*/ 
class WebserverController extends Controller { 
    public function actionUpdateConfig($oneValue, $anotherValue) 
    { 
     // Code that does something 
     if ($success) return 0; 
     else return 1; 
    } 

} 

?> 
+0

das ist großartig, danke fürs Teilen – iamawebgeek

0

Variante 1

Sie können aus einer anderen Aktion eine Aktion des Controllers ausgeführt werden. Zum Beispiel

public function actionCreateAccount() { 
    // something 
} 

public function actionUpdateConfig() { 
    // something 
} 

public function actionComplex() { 
    $this->actionCreateAccount(); 
    $this->actionUpdateConfig(); 
} 

Oder

public function actionCreateAccount() { 
    // something 
    $this->actionUpdateConfig(); 
} 

public function actionUpdateConfig() { 
    // something 
} 

Variante 2

Wenn Sie Aktion von einem anderen Controller nennen neet, können Sie run() Methode der Konsole-Controller verwenden:

für Beispiel Aktion in WebmasterController:

public function actionUpdateConfig($param1, $param2) 
{ 
    echo $param1 . '/' . $param2 . PHP_EOL; 
} 

Aktion in Usercontroller:

public function actionCreateAccount() 
{ 
    echo 'test: '; 
    $this->run('webmaster/update-config', ['do', 'it']); 
} 
+1

Er möchte die Aktion eines anderen Controllers aufrufen. – arogachev

+0

Dann ist es eine gute Variante, run() - Methode des Konsolencontrollers zu verwenden. Zum Beispiel Aktion in WebmasterController: ' \t public function actionUpdateConfig ($ param1, $ param2) \t { \t \t echo $ param1. "/". $ param2. PHP_EOL; \t } ' Aktion in Usercontroller: ' \t öffentliche Funktion actionCreateAccount() { \t \t \t echo 'Test:'; \t \t $ this-> run ('webmaster/update-config', ['do', 'it']); } ' – mnv

2

Aufruf einer Aktion von einem anderen (auch innerhalb einer Controller) ist nicht sehr gut Praxis und klar. Ich schlage einen anderen Ansatz vor.

Verschieben Sie aktualisierende Webserver Config Logik außerhalb eines Webserver Controllers, zum Beispiel, legen Sie es in einer Komponente/Helfer.

Dann können Sie diese Methode von überall im Benutzer-Controller und Webserver-Controller aufrufen.

Beispiel. In Webserver Komponente:

public static function updateConfig() 
{ 
    ... 
} 

In User Controller:

public function actionCreateAccount() 
{ 
    ... 
    Webserver::updateConfig(); 
} 

In Webserver Controller:

public function actionUpdateConfig() 
{ 
    Webserver::updateConfig(); 
} 

Ich denke, das mehr wiederverwendbar und klar ist.

+0

Während ich denke, dass ein benutzerdefinierter Helfer eine Möglichkeit ist, dies zu tun, bin ich nicht sicher, ob dies die richtige Designentscheidung ist - da es ein Helfer wäre, der Funktionen hat, die von bestimmten Modellen abhängen. Ich hatte immer das Gefühl, dass die Helfer in sich geschlossen sein sollten. – CarstenSchmitz

+0

Es kann eine Komponente sein und hängt von einigen Klassen, Modellen usw. ab. – arogachev

+0

Eine Aktion von einer anderen anzurufen ist viel schlimmer für mich. – arogachev

Verwandte Themen