tp6使用cli(cmd)命令行模式调用访问控制器

tp6使用cli(cmd)命令行模式调用访问控制器

因为thinkphp6 简称tp6,默认不支持直接cli命令行模式访问控制器,于是利用官方的command实现了访问控制器.

优点如下:

1、调试方便,能准确的抛出各种异常(顺便吐槽下tp6框架的命令行基本上是个鸡肋,远远达不到laravel/yii2的易用级别。)

2、无需重复配置命令行,基本上配一次后,让tp6命令行达到与控制器一样方便使用的级别

不足点:

class与function大小写需要严格区分,对于洁癖程序猿可能是优点,如果你不想注意大小写,class与function简单粗暴用小写就行。

实现效果如下 ,支持多模块:

php think action 模块/控制器/方法
php执行命令 tp6框架命令行入口文件 编写的action方法 模块/控制器/方法

可支持参数比如

php think action common/test/index --option name=jack,age=10

Action代码如下

<?php
declare (strict_types=1);

namespace app\common\controller;

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

在config/console.php中,添加

'commands' => [
    "action"=>"\app\common\controller\Action",
],

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TP6框架中,使用Postman调用接口并返回HTML时,想要让它返回错误信息,可以采取一些方法来实现。 首先,我们可以在TP6框架中的控制器中手动抛出自定义的异常。例如,当接收到错误请求时,我们可以在控制器方法使用`throw new \think\Exception('错误信息', 错误码);`来主动抛出异常。 接着,在全局异常处理中心进行异常捕获和处理。在TP6框架中,我们可以通过在应用根目录下的`app`文件夹中创建自定义的全局异常处理类,并在该类中重写`render`方法。在`render`方法中,我们可以将捕获到的异常转化为我们想要的错误信息格式并返回给客户端。 下面是一个简单的示例: ```php // 在控制器中抛出自定义异常 public function index() { // 当错误请求时 if (条件判断) { throw new \think\Exception('错误信息', 错误码); } } // 创建自定义的全局异常处理类 namespace app; use think\exception\Handle; use think\Response; use Throwable; class ExceptionHandle extends Handle { public function render($request, Throwable $e): Response { // 判断是否是自定义异常 if ($e instanceof \think\Exception) { $errorMsg = $e->getMessage(); $errorCode = $e->getCode(); // 将异常信息转化为HTML格式进行返回 return Response::create([ 'status' => 'error', 'code' => $errorCode, 'message' => $errorMsg, ], 'json'); } // 非自定义异常交由TP6默认异常处理 return parent::render($request, $e); } } ``` 最后,需要在TP6框架的配置文件`config`目录下的`app.php`中指定自定义的全局异常处理类。找到`exception_handle`键值对,并将其值替换为`\app\ExceptionHandle::class`,以确保框架能够正确地使用全局异常处理类。 以上是使用TP6框架和Postman实现返回错误信息的简单介绍。当接口调用出错时,通过以上方法,可以将错误信息以HTML格式返回给客户端,帮助调用方更好地理解和处理异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值