2015-12-14 19 views
8

Ho creato un comando console in console/controllers con SuggestionController.Come eseguire il comando console in yii2 dal web

Se eseguo il comando come php yii suggestions, funziona.

Voglio sapere come eseguire il comando della console dal web senza alcuna estensione di yii2.

+0

magari provare 'exec()', ma è generalmente cattiva idea. – ineersa

+0

https://github.com/toriphes/yii2-console-runner sta facendo esattamente quello che ti serve. – ineersa

+0

Possibile duplicato di [Come posso chiamare un comando della console nell'applicazione Web in Yii 2.0] (http: // stackoverflow.it/questions/25355483/how-can-i-call-a-console-comando-in-web-application-in-yii-2-0) – SilverFire

risposta

1

È possibile sia exec() che il comando '''php yii suggerimenti''' ma questo potrebbe causare problemi di autorizzazione con l'utente del server web.

Il modo migliore è utilizzare un'estensione ConsoleRunner, ad es. yii2-console-runner o yii2-console-runner-extension che rendono il lavoro di controllo dei lavori un po 'più sofisticato e più sicuro con popen().

Essere sempre a conoscenza di iniezioni di codice durante l'esecuzione di exec() e simili!

+0

Cosa c'è di sbagliato in questa risposta? – WeSee

+0

ora funziona su root folter. quindi come posso eseguire in un'altra cartella. – dungphanxuan

+1

ho impostato chdir ('Cartella'); quindi è un lavoro, grazie – dungphanxuan

2

Questo è il modo in cui ho trovato e utilizzato qualche tempo fa per eseguire il controller/azione console yii (l'ho usato per eseguire migrazioni dal web).

Nel vostro web azione di controllo:

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

può essere fatto molto più semplice

$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

Penso che questa sia la soluzione più semplice:

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

Come di Yii2 - 2.0.11.2 avanzata app - questo funziona

Prima di tutto assicurarsi controller e spazio dei nomi corretto. In questo caso frontend applicazione accedendo metodo di importazione applicazione console()

In Console \ controller \ FhirController

enter image description here

Impostare l'alias di essere disponibili nella console \ config \ main.php [FACOLTATIVO]

enter image description here

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

Infine dal punto di vista frontend, effettuare la chiamata in questo modo: In questo caso, chiamando il fhir percorso di controllo allora il metodo di importazione()

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