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使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示