在上一篇文章中,找到了一种在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 action api/index/index -o name=ning,age=18,可以看到输出结果为:{"name":"ning","age":"18"}。说明多应用模式也是支持的。
现在你应该知道如果在tp6中通过自定义指令,执行控制器中的方法了。
声明:
① 凡本网所有原创文章及图片、图表的版权均属WX部落所有,如需转载,需注明“信息来源:WX部落”,并且添加本文地址:http://wxbuluo.com/index/article/43.html
② 凡本网注明“来源:XXX(非WX部落)”的文字及图片内容,均转载自其他媒体,版权归原媒体及作者所有。转载目的在于传递更多的资讯,并不代表本网赞同其观点和对其真实性负责。如有侵权,请联系删除。联系方式:296720094@qq.com
③ 本网站的资源部分内容来源于网络,仅供大家学习与参考,如有侵权,请联系站长296720094@qq.com进行删除处理。
④ 部分项目课程具有时效性,如发布时间较长请搜索相关课程选择发布时间最近的查看。
⑤ 部分具有时效性的项目课程文章,我们会逐步转移到免费类分类开放下载。同时免费分类链接失效不补!
⑥ 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
上一篇:tp6 中间件如何跳转
下一篇:没有更多文章了
2023 © wxbuluo.com ALL Rights Reserved. 鲁ICP备15005397号-1