微信公众号定制开发

thinkphp6.0使用自定义指令执行控制器中的方法

来源:微信部落

本文主要讲解了,在thinkphp6.0中,如果通过自定义指令执行控制器中的方法

上一篇文章中,找到了一种在thinkphp6.0中通过命令行执行控制器中方法的办法,但是因为需要修改框架源码,感觉不太好。

这篇文章,通过tp6.0提供的自定义指令,实现了在命令行中,执行控制器中的方法,并且可以传递参数,这种方式,比之前修改源码的方式要好,推荐使用。

1、创建一个指令

php think make:command Action

2、app\command\Action.php

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

class Action extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('action')
            ->addArgument('route', Argument::REQUIRED, '控制器方法路径')
            ->addOption('options', 'o', Option::VALUE_OPTIONAL, '参数')
            ->setDescription('the action command');
    }

    protected function execute(Input $input, Output $output)
    {
        $arguments = $input->getArguments();
        $params = [];
        if ($input->hasOption('options')) {
            $params = $this->handleOptions($input->getOption('options'));
        }
        $action = $this->handleRoute($arguments['route'])['action'];
        $result = app($this->getClassPath($arguments['route']))->$action($params);
        $result = $result ?: '';
        $output->writeln(is_array($result) ? json_encode($result) : is_object($result) ? $result->getContent() : $result);
    }

    /**
     * Notes: 处理options
     * Author: 陈宁
     * Website: http://wxbuluo.com
     * DateTime: 2021/12/29 14:01
     * @param $options
     * @return array
     */
    protected function handleOptions($options)
    {
        $optionsArr = explode(',', $options);
        $params = [];
        foreach ($optionsArr as $v) {
            $temp = explode('=', $v);
            $params[$temp[0]] = $temp[1];
        }
        return $params;
    }

    /**
     * Notes: 处理路由
     * Author: 陈宁
     * Website: http://wxbuluo.com
     * DateTime: 2021/12/29 14:02
     * @param $route
     * @return array
     */
    protected function handleRoute($route)
    {
        $routeArr = explode('/', $route);
        $data = [];
        if (count($routeArr) == 3) {
            list($data['module'], $data['controller'], $data['action']) = $routeArr;
        } elseif (count($routeArr) == 2) {
            list($data['controller'], $data['action']) = $routeArr;
        }
        return $data;
    }

    /**
     * Notes: 获取要实例化的类的路径
     * Author: 陈宁
     * Website: http://wxbuluo.com
     * DateTime: 2021/12/29 14:02
     * @param $route
     * @return string
     */
    protected function getClassPath($route)
    {
        $routeArr = $this->handleRoute($route);
        $data[] = 'app';
        if (isset($routeArr['module'])) {
            $data[] = $routeArr['module'];
        }
        $data[] = 'controller';
        $data[] = $routeArr['controller'];
        return implode('\\', $data);
    }
}

3、在config\console.php中添加指令

<?php
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
    // 指令定义
    'commands' => [
        'action' => 'app\command\Action',
    ],
];

4、然后我们在app\controller\Test.php中添加一个测试方法

<?php

declare(strict_types=1);

namespace app\controller;

class Test
{
    public function test($params = [])
    {
        return json($params);
    }
}

5、在命令行中执行:php think action test/test -o name=ning,age=18

可以看到输出结果:{"name":"ning","age":"18"}

6、我们再测试一下多应用模式,安装多应用模式扩展

composer require topthink/think-multi-app

7、创建一个新模块:php think build api

8、在app\api\controller\Index.php中添加测试代码:

<?php

declare(strict_types=1);

namespace app\api\controller;

class Index
{
    public function index($params = [])
    {
        return json($params);
    }
}

9、在命令行中执行:php think phpphp think action api/index/index -o name=ning,age=18,可以看到输出结果为:{"name":"ning","age":"18"}。说明多应用模式也是支持的。

现在你应该知道如果在tp6中通过自定义指令,执行控制器中的方法了。

声明:

① 凡本网所有原创文章及图片、图表的版权均属微信部落所有,如需转载,需注明“信息来源:微信部落”,并且添加本文地址:http://wxbuluo.com/index/article/43.html

② 凡本网注明“来源:XXX(非微信部落)”的文字及图片内容,均转载自其他媒体,版权归原媒体及作者所有。转载目的在于传递更多的资讯,并不代表本网赞同其观点和对其真实性负责。如有侵权,请联系删除。联系方式:296720094@qq.com

上一篇:tp6 中间件如何跳转

下一篇:没有更多文章了