Thinkphp5 命令行执行代码

2024-08-25 11:38

本文主要是介绍Thinkphp5 命令行执行代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abraa/article/details/78932099
说明:如何用命令行执行正常的tp5代码

前言:
      在此之前,你应当能正常使用linux php命令行,包括但不限于php安装,环境变量配置等…

简单示例执行:
      官网文档关于命令行的介绍非常简短,没有接触过很容易云里雾里,不知所谓.当然你也可以看它的源码示例,调试几遍也就基本了解了.
      这篇文章主要是用于你不想去调试源码,或者参考使用.
      hello word !
      我们构建一个PHP命令 hello 
      #>   php think hello  
      hello word !
      代码示例
首先在application 文件夹下建立一个新文件夹command(用来放我们自定义的Tp命令) 我们取名叫Hello.php(随意取)

<?php 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\Request; class Hello extends Command{                            //继承think\console\Command     /**      * 重写configure      * {@inheritdoc}      */     protected function configure()     {         $this->setName('hello')             ->setDescription('hello word !');     }     /**      * 重写execute      * {@inheritdoc}      */     protected function execute(Input $input, Output $output)     {         $output->writeln('hello word !');     } } ?>

这样我们简单的hello命令就完成了.
可是现在我们cd 到tp根目录(就是有think这个php文件的目录) 执行php think hello 报错 : Command “hello” is not defined.

这是因为我们还缺少一个配置文件
编辑 application/command.php(没有就新建) 加上Hello.php文件的namespace

<?php return [ "app\\command\\Hello", ]; ?>

好了 ,现在我们的hello命令完成了. 是不是很简单?

现在我们开始进阶版.
我们如何像浏览器访问那样用命令行去执行php代码呢?
我们修改hello命令,还是输出一个hello word !
现在我们有一个index模块(module) , index控制器(controller) , index方法(action)

<?php namespace app\index\controller; class Index { public function index() { return 'hello word !'; } } ?>

hello命令代码

<?php 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\Request; class Hello extends Command{ //继承think\console\Command /** * 重写configure ---定义命令 * {@inheritdoc} */ protected function configure() { $this->setName('hello') //命令名称 ->setDefinition([ //Option 和 Argument都可以有多个, Argument的读取和定义的顺序有关.请注意 new Option('option', 'o', Option::VALUE_OPTIONAL, "命令option选项"), //使用方式 php think hello --option test 或 -o test new Argument('test',Argument::OPTIONAL,"test参数"), //使用方式 php think hello test1 (将输入的第一个参数test1赋值给定义的第一个Argument参数test) //... ]) ->setDescription('hello word !'); //命令描述 } /** * 重写execute ---执行入口 * {@inheritdoc} */ protected function execute(Input $input, Output $output) { //Input 用于获取输入信息 Output用于输出信息 $request = Request::instance([ //如果在希望代码中像浏览器一样使用input()等函数你需要示例化一个Request并手动赋值 'get'=>$input->getArguments(), //示例1: 将input->Arguments赋值给Request->get 在代码中可以直接使用input('get.')获取参数 'route'=>$input->getOptions() //示例2: 将input->Options赋值给Request->route 在代码中可以直接使用request()->route(false)获取 //... ]); $request->module("Index"); //绑定当前模块为Index 只有绑定模块你在代码中使用model('user')等函数才不需要指定模块model('index/user') // $request->controller('index')->action('index'); //绑定controller和action $output->writeln(controller('index/Index')->index()); //执行index模块index控制器index函数 ,并输出返回值 } } 输出 hello word ! 基本使用就到这了,如果希望了解更多详细用法可以去看源码和tp实现的几个命令示例,还是相当明了的.  当然你也可以继续看下去,但不会太过详细,只会有个基本介绍 文件架构详解: 我们从文件入口目录结构讲起: ---------------    |-think   入口文件    |-thinkphp   框架目录       |-console.php 命令行入口       |-library           |-think      |-App.php  ---App::initCommon() ;这是tp的初始化函数  只需要执行它你就可以使用整个tp5框架的功能了.      |-Console.php    ---Console::init(); 这是tp的命令加载函数  执行它就可以使用tp的自定义命令了.       .... 略过框架实现的介绍(有兴趣的自己去看源码),简要说一下常用到却少接触的几个文件,毕竟我们的目的只是使用 1.首先当然是think\console\Command :    执行命令的入口文件除了框架自己定义的execute() 也可以在初始化initialize(Input $input, Output $output)时通过$this->setCode(callback fn);来手动设置执行入口 (callback怎么用? 参考call_user_func())(比如调用$this->index() 就是: $this->setCode([$this,'index']);)     这样就可以在一个命令里逻辑区分使用不同的入口   2.input :     好像没啥好讲得源码注释很详细. 只需要知道你所有的输入都在这个里面取就好了.   主要分成2块 Option 和 Argument 怎么定义怎么用就随你了. 3.request :    虽然request放在这里感觉有点不大合适,但谁让tp helper函数都是基于request的呢? 虽然不需要它也能使用但要有和浏览器同样的体验(比如一样的代码能在浏览器和命令行同时执行),还是自己手动实例化一个request吧.    挺多的自己去看源码吧,注释挺详细的...    一般也就instance(['post'=>[],'get'=>[]...]) 实例化并绑定几个参数 再$request->module('index')绑定下当前模块就差不多了.毕竟像$_SERVER之类的自己设也没啥意义 ———————————————— 版权声明:本文为CSDN博主「abraa」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/abraa/article/details/78932099

这篇关于Thinkphp5 命令行执行代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105458

相关文章

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(