在yii2 advanced中使用console

console 是命令行操作,对于frontend和backend是基于web的操作,最终的结果是一样的,都是传递数据给php,下面做一个例子:

1.安装frontend ,然后执行init,可以参看这里:

Yii2 – 安装高级模板 advanced project template

2.新建文件夹/console/controllers/script,然后新建文件TestController.php

3.编辑文件内容:

<?php

namespace console\controllers\script;
use Yii;
use yii\console\Controller;
use fec\helpers\CDate;
use fec\helpers\CConfig;
use appadmin\code\Website\models\WebsiteBaseInfo;
class TestController extends Controller
{
        public $_mongodbdb;


        public function actionGetbegindate(){
                echo '2015-05-20';

        }


        public function actionCreatecollindexer(){
                echo 'create Coll index success';

        }
        public function actionMy($param1,$param2=''){
                echo "param1:".$param1;
                echo "param2:".$param2;
        }


}

4.回到yii advanced的根目录执行:

[root@services datacenter_1000]# ./yii script/test/my  111  2222
param1:111param2:2222
[root@services datacenter_1000]#

解读:

script/test/my 这个和web一样,对应到上面创建的TestController的 actionMy()方法,111为传递的第一个参数,222给传递的第二个参数。

到这里,基本就一个helloworld就写好了,其他的和web没有什么两样。

5.在模块中使用console:(下面是一个在模块TA中使用console的例子)

'modules'=>[

'ta' => [
        'class' => 'appadmin\code\Ta\Module',
        'params'=> [
            'channel_type' => [
                'ppc'    => 'PPC类型',
            ],
        ],
    ],

]

在ta模块的Module中添加代码:

<?php
namespace appadmin\code\Ta;
use Yii;
class Module extends \fec\AdminModule
{
   
    public function init()
    {
    //echo 1;exit;
    # 以下代码必须指定
    # web controller
    if (Yii::$app instanceof \yii\web\Application) {
      $this->controllerNamespace 	= 	__NAMESPACE__ . '\\controllers';
    # console controller
    } elseif (Yii::$app instanceof \yii\console\Application) {
      $this->controllerNamespace 	= 	__NAMESPACE__ . '\\console';
    }
    
    parent::init();  
    
    }
}

通过上面判断是console的application还是web的application,取执行相应的controller

譬如我写的一个导入excel的脚本(在ta模块中):

<?php
namespace appadmin\code\Ta\console\import;
use Yii;
use appadmin\code\Ta\models\WebsiteChannel;
use yii\console\Controller;
use fec\helpers\CExcel;

class ExcelController extends Controller
{
  public function actionChannel(){
    $channel_excel_file = Yii::getAlias('@appta/var/import/channel.xlsx');
    $arr = CExcel::getExcelContent($channel_excel_file);
    //var_dump($arr);
    $i = 0;
    foreach($arr as $one){
      $i++;
      if($i == 1){
        continue;
      }
      $channel 		= trim($one['A']);
      $channel_child 	= trim($one['B']);
      $domain 		= trim($one['C']);
      
    
      $one = WebsiteChannel::find()->where([
        'channel' => $channel,
        'channel_child' => $channel_child,
        'domain' => $domain,
      ])->one();
      if(!$one['id']){
        $WebsiteChannel = new WebsiteChannel;
      }else{
        continue;
      }
      //SEO>SEM>KOL>SNS
      
      
      $WebsiteChannel->channel 		= $channel;
      $WebsiteChannel->channel_child  = $channel_child;
      $WebsiteChannel->domain 		= $domain;
      
      $WebsiteChannel->created_person = 'program_script';
      $WebsiteChannel->save();
      unset($WebsiteChannel);
      
    }
  }
  
  
  
  
}

我新建一个shell文件

appta/shell/import/channel.sh,内容为:

#!/bin/sh
DIR=$(cd `dirname $0`; pwd)
$DIR/../../../yii ta/import/excel/channel

然后执行这个shell就会执行上面的模块Ta里面的console部分。