2015-10-29 15 views
6

Ho creato due diversi comandi/controller della console Yii2.Yii2 - Chiama un comando della console Yii da un altro comando della console?

Esempio chiamarli è

# yii user/create-account 

e

# yii webserver/update-config 

Dopo user/creare account s'è voglio chiamare webserver/update-config - è possibile farlo dal di dentro Yii per codice? O devo usare exec()/system() per chiamare esternamente il secondo script php di yii (preferirei non farlo).

Qualsiasi aiuto/approfondimento sarebbe apprezzato!

+0

consultare questo forse utile: https://github.com/vova07/yii2-console- runner-extension –

risposta

7

Dopo alcune considerazioni il modo in cui ho scelto di chiamare un controller dall'interno di un altro era utilizzando il metodo runAction del controller (che è anche il modo consigliato dagli sviluppatori di Yii).

Esempio per un'applicazione console:

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

È anche possibile consegnare params utilizzando una matrice come secondo parametro.

Un esempio per semplici parametri:

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

Ecco un esempio per i parametri denominati:

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

Si prega di notare che questo rende la chiamata di controllo di una parte del codice chiamante. Quindi se il controller chiamato fallisce per qualche motivo l'intero programma fallisce. Una buona gestione degli errori è un must. Nel controller chiamato è possibile impostare il codice di errore da restituire utilizzando return.

Esempio:

del chiamante di codice:

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

controller chiamato:

<?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

questo è fantastico, grazie per la condivisione – iamawebgeek

0

Variante 1

È possibile eseguire un'azione di controllo da un'altra azione. Ad esempio,

public function actionCreateAccount() { 
    // something 
} 

public function actionUpdateConfig() { 
    // something 
} 

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

O

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

public function actionUpdateConfig() { 
    // something 
} 

Variante 2

Se neet chiamare all'azione di un altro controller, è possibile utilizzare run() metodo di controllo della console:

Per esempio, azione in WebmasterController:

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

azione UserController:

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

Vuole chiamare l'azione di un altro controller. – arogachev

+0

Quindi è una buona variante utilizzare il metodo run() del controller della console. Ad esempio, l'azione in WebmasterController: ' \t funzione pubblica actionUpdateConfig ($ param1, $ param2) \t { \t \t echo $ param1. '/'. $ param2. PHP_EOL; \t} ' azione UserController: ' \t funzione pubblica actionCreateAccount() { \t 'test:' \t \t eco; \t \t $ this-> run ('webmaster/update-config', ['do', 'it']); ' – mnv

2

Chiamata un'azione da un altro (anche in un controller) non è molto buona pratica e chiaro. Suggerisco un altro approccio.

Spostare l'aggiornamento della logica di configurazione del server Web all'esterno di un controller Webserver, ad esempio posizionarlo in alcuni componenti/helper.

Quindi è possibile chiamare questo metodo da qualsiasi punto in particolare nel controller utente e controller webserver.

Esempio. In Webserver componente:

public static function updateConfig() 
{ 
    ... 
} 

In User regolatore:

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

In Webserver regolatore:

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

Penso che questo sia più riutilizzabile e chiaro.

+0

Mentre penso che un helper personalizzato sia un modo per farlo, non sono sicuro che questa sia la decisione di progettazione giusta, poiché sarebbe un aiuto che ha funzioni che dipendono da determinati modelli. Ho sempre avuto la sensazione che gli aiutanti dovrebbero essere autonomi/indipendenti. – CarstenSchmitz

+0

Può essere un componente e dipende da alcune classi, modelli, ecc. – arogachev

+0

Chiamare un'azione da un'altra è molto peggiore per me. – arogachev

Problemi correlati