网上看了很多例子关于yaf怎么在cli模式下执行模块、控制器、方法+参数的例子,也跟着搬了很多例子,大多的都不行。所以为了用yaf,或者想用yaf到实际项目的猿们,我决定把自己在yaf里面踩过的坑都跟大家分享出来,我用的yaf版本是3.0.7
思路: 默认情况下yaf在cli模式下是会跑到index模块,index方法,index控制器的(即application\controllers\Index.php),那么我们在这个控制器上面增加点代码,判断是cli访问的话就让它根据传入来的模块控制器方法,参数,执行不同的操作
yaf cli的使用场景:
yaf在cli模式下执行index/demo/db 方法(index/demo/db其中index是模块,demo是方法,db是方法)
解决:php index.php "index/demo/db"
yaf在cli模式下执行index/demo/db 方法,并且传递参数a=100&b=200
执行:php index.php "index/demo/db" "a=100&b=200"
yaf在cli模式下传递的参数控制器中接收参数用:$params = Yaf_Controller_Abstract::getRequest()->getParams();
代码如下:
<?php
/**
* @name IndexController
* @author Administrator
* @desc 默认控制器
*/
class IndexController extends Yaf_Controller_Abstract {
/**
* 默认动作
* cli模式全部先跑这里,然后再根据不同的模块/控制器/方法,参数调用不用的方法
*/
public function indexAction(){
//php index.php "index/demo/rmqhello"
if(PHP_SAPI == 'cli'){
if(isset($_SERVER['argv'][1])){
$mvc = explode('/',$_SERVER['argv'][1]);
$module = isset($mvc[0])?$mvc[0]:'';
$controller = isset($mvc[1])?$mvc[1]:'';
$action = isset($mvc[2])?$mvc[2]:'';
$params = isset($_SERVER['argv'][2])?$this->convertUrlQuery($_SERVER['argv'][2]):[];
$this->forward($module,$controller,$action,$params);
}
}
/**
* 把参数a=100&b=200解析成array('a'=>100,'b'=>200),written:yagnxignyi
*/
function convertUrlQuery($query)
{
$queryParts = explode('&', $query);
$params = array();
foreach ($queryParts as $param) {
$item = explode('=', $param);
$params[$item[0]] = $item[1];
}
return $params;
}
}
以上代码可以解决你在yaf cli模式下无法执行控制器方法的问题,如对你有帮助或者疑问请留言。