thinkphp6的命令行访问控制器方法需要自己实现,不像tp5 可以 php think 模块/控制器/方法,我们需要通过自定义命令自己实现一个简单的命令来进行访问调试
第一步:
首先新建action 自定义command ,运行命令示例:
php think action index/index/hello --option name=222,b=222333
自定义命令内容如下:参考链接
<?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') // 额外选项 用来传递方法参数 --option name=yourname,password=yourpass
->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); // $classObj->$fun($params);
$output->writeln($result);
} else {
$class_fun = $this->route($Argument['route']);
// throw new Exception("类".$class_fun['class']);
// throw new Exception("方法".$class_fun['fun']);
$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], []); // $classObj->$fun($params);
$output->writeln($result);
$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(222);
var_dump($e->getMessage());
}
}
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[1];
}
/* 整理成数组 end */
return $params;
}
}