tp6使用cli(cmd)命令行模式调用访问控制器
因为thinkphp6 简称tp6,默认不支持直接cli命令行模式访问控制器,于是利用官方的command实现了访问控制器.
优点如下:
1、调试方便,能准确的抛出各种异常(顺便吐槽下tp6框架的命令行基本上是个鸡肋,远远达不到laravel/yii2的易用级别。)
2、无需重复配置命令行,基本上配一次后,让tp6命令行达到与控制器一样方便使用的级别
不足点:
class与function大小写需要严格区分,对于洁癖程序猿可能是优点,如果你不想注意大小写,class与function简单粗暴用小写就行。
实现效果如下 ,支持多模块:
php think action 模块/控制器/方法
可支持参数比如
php think action common/test/index --option name=jack,age=10
1.command代码如下
<?php /** * Created by wenhainan * 网址: https://www.waytomilky.com/ */ namespace app\command; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\input\Option; use think\console\Output; use think\Exception; class Action extends Command{ protected function configure() { $this->setName("action") ->addArgument("route",Argument::OPTIONAL,"your run route path!")//路由地址必须输入 ->addOption('option','o',Option::VALUE_REQUIRED,'set Controller Argument') ->setDescription("Command run Controller Action !"); } protected function execute(Input $input, Output $output) { $Argument = $input->getArguments(); if($Argument['command'] == 'action'){ if($input->hasOption('option')){ $params = $this->option($input->getOption('option')); $class_fun = $this->route($Argument['route']); $fun = $class_fun['fun']; $result = app("{$class_fun['app']}\\{$class_fun['module']}\\{$class_fun['controller']}\\{$class_fun['class']}")->$fun($params); $output->writeln($result); }else{ $class_fun = $this->route($Argument['route']); // throw new Exception("类".$class_fun['class']); // throw new Exception("方法".$class_fun['fun']); $fun = $class_fun['fun']; $result = app("{$class_fun['app']}\\{$class_fun['module']}\\{$class_fun['controller']}\\{$class_fun['class']}")->$fun(); $output->writeln($result); } } } public function route($route = ''){ // throw new Exception("路由是".$route); $class_fun['class'] = "app\\index\\controller\\index"; $class_fun['fun'] = "index"; if($route){ $app = "app"; $controller = "controller"; $route = explode("/",$route); $module = isset($route[0])?$route[0]:"index"; $class = isset($route[1]) ? $route[1] : 'index'; $fun = isset($route[2]) ? $route[2] : 'index'; // $class_fun['class'] = $app."\\".$module."\\".$controller."\\".$class; $class_fun['class'] = $class; $class_fun['fun'] = $fun; $class_fun['module'] = $module; $class_fun['app'] = $app; $class_fun['controller'] = $controller; } return $class_fun; } public function option($option){ /* 整理成数组 start */ $params = array(); $option_arr = explode(",",$option); foreach ($option_arr as $key=>$val){ $temp_params = explode("=",$val); $params[$temp_params[0]] = $temp_params[1]; } /* 整理成数组 end */ return $params; } }
2.在config/console.php中,添加
"action"=>"app\common\command\Action",
3.使用案例
php think action common/test/index --option name=jack,age=10
对应控制器方法
public function index($params=array()){
print_r($params);
print_r("cmd输出\n");
return "结果";
}