在上一篇文章中,找到了一种在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