【问题标题】:Yii2: Run a web action in a console controllerYii2:在控制台控制器中运行 Web 操作
【发布时间】:2018-05-31 15:44:00
【问题描述】:

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

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

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

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

Error: Unknown command "controller/action".

【问题讨论】:

  • 您可以简单地发出一个 http 请求(使用 curl 或其他)。或者将您的代码放在其他地方,以便能够在控制台和 Web 控制器中使用它。
  • @soju 在这种特殊情况下使用 cURL 相对困难,因为使用 LDAP 凭据进行身份验证。
  • 那么你应该检查你的代码逻辑。
  • 你错了罗伯特,这个扩展是关于从 web 运行控制台命令...

标签: yii2


【解决方案1】:

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

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

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


此外,为 web 操作禁用 enableCsrfValidation

public function beforeAction($action)
{    
    if ($action->id == 'action') {
        $this->enableCsrfValidation = false;
    }    

    return parent::beforeAction($action);
}

'action' ID 可以替换为您当前的网络操作 ID。

【讨论】:

  • 在哪里添加?在控制台控制器或网络控制器中?
  • @MrFaisal 在控制台控制器中添加代码以调用 Web 操作。
  • 我想知道为什么它没有被标记为正确答案。它对我有用
  • @MrFaisal 确保return parent::beforeAction($action); 总是从beforeAction() 返回。
  • @MrNick 是的,我错过了这个
【解决方案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 可能会阻止执行

【讨论】:

  • 我已经尝试过您的解决方案。确实可行,但是有几个问题,所以我决定使用 cURL,见下面的代码。
【解决方案3】:

使用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多