2016-04-13 26 views
0

コントローラコンソールコントローラでWebアクションを実行することはできますか?Yii2:コンソールコントローラでWebアクションを実行する

ウェブコントローラ(yii \ web \ Controller)には、私はcronジョブとして実行したいアクションがあります。私は、コンソールコントローラ(Yiiの\コンソール\コントローラ)で、それを実行しようとした場合でも:申し訳ありませんが、私はの文脈を理解していなかった

Error: Unknown command "controller/action". 
+0

あなたは、単に(他にカールまたはを使用して)HTTPリクエストを作ることができます。あるいは、あなたのコードをコンソールとWebコントローラで使用できるように別の場所に置いてください。 – soju

+0

@sojuこの特定のケースでは、LDAPクレデンシャルによる認証があるため、相対的にcURLを使用するのは困難です。 –

+0

次に、コードロジックを確認してください。 – soju

答えて

1

Yii::$app->runAction('controller/action'); 

その後、私は、次のエラーメッセージが表示されます。質問。

@sojuによれば、CURLを使って行う方法があるはずですが、方法があります。

$config = \yii\helpers\ArrayHelper::merge(
      require(Yii::getAlias('@common').'/config/main.php'), 
      require(Yii::getAlias('@common').'/config/main-local.php'), 
      require(Yii::getAlias('@frontend').'/config/main.php'), 
      require(Yii::getAlias('@frontend').'/config/main-local.php') 
     ); 

$web_application = new \yii\web\Application($config); 
$web_application->runAction('/site/index',['param1' => 1,'param2' => 2]); 

あなたは、その後のAccessControlが実行

+1

私はあなたの解決策を試しました。それはうまくいきましたが、いくつかの問題があったので、私はcURLを使うことにしました。下記のコードを見てください。 –

1

にcURLを持つソリューションを防ぐことができ、コントローラは、彼らの行動で動作することに注意する必要があります。 ウェブコントローラで

CSRFの検証を無効にする必要があります。

public function beforeAction() { 
    if ($this->action->id == 'export') { 
     Yii::$app->controller->enableCsrfValidation = false; 
    } 
    return true; 
} 

コンソールコントローラでのcURLコマンドは、例えば見ることができます

$ch = curl_init(); 

$options = array(
    CURLOPT_URL    => $url, 
    CURLOPT_REFERER   => $url, 
    CURLOPT_FOLLOWLOCATION => 1, 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_COOKIESESSION => true, 
    CURLOPT_COOKIEJAR  => 'curl-cookie.txt', 
    CURLOPT_COOKIEFILE  => '/var/www/yii/frontend/web/tmp', 
    CURLOPT_CONNECTTIMEOUT => 120, 
    CURLOPT_TIMEOUT   => 120, 
    CURLOPT_MAXREDIRS  => 10, 
    CURLOPT_USERAGENT  => "Dark Secret Ninja/1.0", 
    CURLOPT_POST   => 1, 
    CURLOPT_POSTFIELDS  => "LoginForm[username]=".$username. 
     "&LoginForm[password]=".$password. 
     "&LoginForm[rememberMe]=1", 
    CURLOPT_SSL_VERIFYPEER => false, 
); 
curl_setopt_array($ch, $options); 

$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code 

if ($httpCode != 200){ 
    echo "Return code is {$httpCode} \n" 
     .curl_error($ch); 
} else { 
    echo htmlspecialchars($response); 
} 
curl_close($ch); 
2

実行コンソールコントローラ内のウェブアクション:

Yii::$app->controllerNamespace = "app\controllers"; 
Yii::$app->runAction('controller/action'); 

割り当てcontrollerNamespaceコンソールからウェブアクションを実行する前に、このような。また


、ウェブアクションのenableCsrfValidationを無効にします。

public function beforeAction($action) 
{  
    if ($action->id == 'action') { 
     $this->enableCsrfValidation = false; 
     return parent::beforeAction($action); 
    }  
} 
関連する問題