tp6 cli 命令行 去访问控制器跟控制器内方法

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;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值