2016-04-13 9 views
0

web eylemi konsol denetleyicisinde çalıştırılabilir mi?Yii2: Bir konsol denetleyicisinde web eylemi gerçekleştirin

Bir web denetleyicisinde (yii \ web \ Controller) Bir cron işi olarak çalışmak istediğim bir eylem var. Ama bir konsol denetleyicisi (yii \ konsol \ Kontrolörü) çalıştırmayı denerseniz:

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

aşağıdaki hata iletisi:

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

Sadece bir http isteği yapabilir (başka kıvrılmış veya kullanarak). Ya da bir konsolda ve bir web denetleyicide kullanabilmek için kodunuzu başka bir yere koyun. Bu özel durumda – soju

+0

@soju, LDAP kimlik bilgileriyle kimlik doğrulaması olduğundan cURL'nin nispeten zor kullanımıdır. –

+0

Ardından kod mantığınızı gözden geçirmelisiniz. – soju

cevap

1

Üzgünüm, bağlamını anlamadı soru.

As @soju diyor ki, CURL kullanarak bunu yapmanın bir yolunu bulmalısın, ama bir yolu var.

$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]); 

Sen kontrolör onların davranışları ile çalışır bilmelidir ardından AccessControl yürütme

+1

Çözümü denedim. Çalıştı, ancak birkaç sorun vardı, bu yüzden cURL kullanmaya karar verdim, aşağıdaki kodu inceleyin. –

1

cURL ile çözüm önleyebilir. konsolunda

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

cURL komutları Kontrol örneğin bakabilirsiniz: Web denetleyicisi

CSRF doğrulama devre dışı adres Böyle:

$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

çalıştırın bir konsol denetleyicisi bir web eylemi:

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

atama controllerNamespace konsoldan web eylemini çalıştırmadan önce.


Ayrıca, web eylem için enableCsrfValidation devre dışı bırakın:

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