因为 thinkphp6 简称 tp6,默认不支持直接 cli 命令行模式访问控制器,于是利用官方的 command 实现了访问控制器.
实现效果如下 :
php think action 模块/控制器/方法
1、新建 command,Action:
在 app\command 创建文件:Action.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| <?php declare (strict_types=1);
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) { try { $Argument = $input->getArguments(); if ($Argument['command'] == 'action') { if ($input->hasOption('option')) { $params = $this->option(trim($input->getOption('option')) ?? trim($input->getOption('option'))); $class_fun = $this->route($Argument['route']); $fun = $class_fun['fun']; $namespaceClass = "{$class_fun['app']}\\{$class_fun['module']}\\{$class_fun['controller']}\\{$class_fun['class']}"; $classObj = app($namespaceClass); $result = call_user_func_array([$classObj, $fun], $params); $output->writeln($result); } else { $class_fun = $this->route($Argument['route']); $namespaceClass = "{$class_fun['app']}\\{$class_fun['module']}\\{$class_fun['controller']}\\{$class_fun['class']}"; $fun = $class_fun['fun']; $classObj = app($namespaceClass); $result = call_user_func_array([$classObj, $fun], []); $output->writeln($result); } } else { throw new Exception("方法不存在"); } } catch (\ArgumentCountError $d) { var_dump("function error or not exisit! class = {$namespaceClass} && func = {$fun}"); } catch (\Exception $e) { var_dump($e->getMessage()); }
}
public function route($route = '') { 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'] = $class; $class_fun['fun'] = $fun; $class_fun['module'] = $module; $class_fun['app'] = $app; $class_fun['controller'] = $controller;
}
return $class_fun; }
public function option($option) { $params = array(); $option_arr = explode(",", $option); foreach ($option_arr as $key => $val) { $temp_params = explode("=", $val); $params[] = $temp_params[1]; }
return $params; }
}
|
2、在 config/sonsole.php 中,添加
1 2 3 4
| 'commands' => [ 'action' => '\app\command\Action', ],
|
3、使用案例:
1
| php think action common/test/index --option name=jack,age=10
|
对应控制器方法:
1 2 3 4 5 6 7 8
| public function index($params=array()){
print_r($params); print_r("cmd输出\n"); return "结果";
}
|