有时我们并不希望某个方法被外部访问,这时可以使用cli脚本来解决这个问题。相对于web应用,外界无法访问cli脚本。另外执行cli应用不需要经过web前端软件(nginx/apache)转发,直接php解析执行,效率更高。
Yii原生支持cli应用,即console应用。protected文件夹下的yiic文件,这是cli应用的入口文件。cli应用的默认配置文件是protected/configs/console.php。根据YII的规定,yii框架的cli程序必须位于protected/commands文件夹下。然而这个文件夹默认是没有生成的,我们需要自己新建。
yii的cli应用类必须继承自 CConsoleCommand
,在其中可以定义各种action,同正常的controller一样使用。由于action是在1.1.5之后新增的,在这之前需要实现的是run方法。将configs/console.php配置好后, 下面是一个cli程序的示例:
class TestCommand extends CConsoleCommand { public function run() { echo Yii::getVersion(), PHP_EOL; } }
将工作目录切换到protected下,执行 ./yiic test
即可看到输出。
在yii 1.1.5之后的版本支持和controller类似的action方法,这个时候就可以不在实现run方法了,上述代码可以改造如下:
class TestCommand extends CConsoleCommand { public function actionVersion() { echo Yii::getVersion(), PHP_EOL; } public function actionBasePath() { echo Yii::app()->basePath, PHP_EOL; } }
在protected目录下运行 ./yiic test version
命令即可看到同样的输出。
注意 run
方法和其他action方法不能同时存在一个command类目里面。yii目前的规则是如果有run方法就直接执行run方法内容,不管后面传入的是什么。例如对于上例,如果有 run
方法的存在,那么 version
方法和 basePath
方法就不再其作用,即使已经显示的指明了action方法: ./yiic test version
。
如果没有run方法,cli程序和正常controller一样,执行默认的index方法。为了程序的复用和分类管理,建议使用action方法而非实现run方法。
发表回复