Yii2:在控制台控制器中运行Web操作

时间:2016-04-13 14:32:30

标签: yii2

是否可以在控制台控制器中运行网络操作?

在Web控制器(yii \ web \ Controller)中,我有一个我想作为cron作业运行的动作。但是,如果我尝试在控制台控制器(yii \ console \ Controller)中运行它:

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

然后我收到以下错误消息:

Error: Unknown command "controller/action".

3 个答案:

答案 0 :(得分:3)

在控制台控制器中运行Web操作:

controllerNamespace

在从控制台运行Web操作之前分配enableCsrfValidation

此外,请为网络操作停用public function beforeAction($action) { if ($action->id == 'action') { $this->enableCsrfValidation = false; } return parent::beforeAction($action); }

'action'
  

np.ones((m, n))*k ID可以替换为您当前的网络操作ID。

答案 1 :(得分:2)

抱歉,我不明白问题的背景。

正如@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可以阻止执行

答案 2 :(得分:1)

cURL解决方案。

web 控制器中必须禁用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);