Laravel 5.1框架中如何创建自定义Artisan控制台命令

2024-08-25 11:38

本文主要是介绍Laravel 5.1框架中如何创建自定义Artisan控制台命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于laravel初学者来说,对laravel创建自定义Artisan控制台命令可能是不太了解,接下来的这篇文章给大家分享一下laravel框架中创建自定义Artisan控制台命令的实例。

 

1、入门

Laravel通过Artisan提供了强大的控制台命令来处理非浏览器业务逻辑。要查看Laravel中所有的Artisan命令,可以通过在项目根目录运行:

1

php artisan list

对应输出如下(部分截图):

2015-10-19_211849.jpg

其中一些命名我们已经比较熟悉了,比如创建迁移make:migration以及执行迁移migrate,又比如创建模型make:model,创建控制器make:controller等。

如果要查看具体某个命令的使用方法,比如我们要查看创建Artisan命令make:console的具体用法,可以使用如下命令:

1

php artisan help make:console

对应输出如下:

2015-10-19_212233.jpg

2、创建命令

Artisan除了提供丰富的控制台命令之外,还允许我们通过make:console命令创建自己的控制台命令。上面我们已经使用help指令查看了make:console的用法,下面我们就沿着这条路走下去,一探究竟:创建命令并运行起来得到我们想要的各种结果。

首先我们创建一个最简单的命令,打印Hello LaravelAcademy,使用Artisan命令如下:

1

php artisan make:console HelloLaravelAcademy --command=laravel:academy

其中HelloLaravelAcademy是命令名,laravel:academy是控制台执行的命令,类似make:console。

执行完成后,会在app/Console/Commands目录下生成一个HelloLaravelAcademy.php文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class HelloLaravelAcademy extends Command

{

    /**

     * The name and signature of the console command.

     *

     * @var string

     */

    protected $signature = 'laravel:academy';

    /**

     * The console command description.

     *

     * @var string

     */

    protected $description = 'Command description.';

    /**

     * Create a new command instance.

     *

     * @return void

     */

    public function __construct()

    {

        parent::__construct();

    }

    /**

     * Execute the console command.

     *

     * @return mixed

     */

    public function handle()

    {

        //

    }

}

其中$signature即为在控制台执行的命令名,$description为命令描述,handle方法为执行命令时调用的方法。

接下来我们简单编写handle方法如下:

1

2

3

4

public function handle()

{

    echo "Hello LaravelAcademy\n";

}

好了,一个最简单的命令已经编写好了,接下来要怎么执行并在控制台打印出“Hello LaravelAcademy”呢?

3、运行命令

在运行命令前需要将其注册到App\Console\Kernel的$commands属性中:

1

2

3

4

protected $commands = [

     ...  //其他命令类

     \App\Console\Commands\HelloLaravelAcademy::class

];

接下来我们就可以在控制台运行如下Artisan命令:

1

php artisan laravel:academy

终端就会打印出:

1

Hello LaravelAcademy

是不是很简单?

4、更多样的输入输出

当然,上面是最简单的情形,没有输入,写死的输出。实际环境中有更复杂的需求,有更多样的输入输出,下面我们来一一讨论。

定义输入

上面已经提到,我们可以通过修改$signature属性定义输入参数及选项,比如这里我们将上述Hello后面的字符串调整为通过输入参数来控制,可修改$signature如下:

1

protected $signature = 'laravel:academy {name}';

这样定义意味着name是必选参数,当然还支持更多自定义参数输入:

1

2

{name?} //可选参数

{name=LaravelAcademy} //默认name值为LaravelAcademy

为增强程序健壮性,我们将name修改为有默认值:

1

protected $signature = 'laravel:academy {name=LaravelAcademy}';

有时候我们还会在执行命令时传入一些选项,比如是否显示标点符号(虽然听上去很鸡肋,这里权当测试之用), 那么我们可以修改$signature属性如下:

1

protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark}';

如果调用命令时传递--mark则代表其值为true,否则为false,如果选项值在输入时通过用户设置,可定义$signature如下:

1

protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark=}';

这样用户就可以在传入选项时通过=来为选项赋值,当然和参数一样,我们也可以为选项指定默认值:

1

protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark=!}';

获取输入

定义好输入参数和选项后,又该如何获取其对应值呢?Laravel为我们提供了相应的方法。

获取参数值可以通过Illuminate\Console\Command的argument方法:

1

$name = $this->argument('name');

如果无参调用argument方法,则返回的是所有参数值数组。

获取选项值可以通过Illuminate\Console\Command的option方法:

1

$mark = $this->option('mark');

同理,无参调用option方法会返回所有选项值数组。

这样我们可以修改HelloLaravelAcademy的handle方法如下:

1

2

3

4

5

6

7

8

9

public function handle()

{

    $name = $this->argument('name');

    $mark = $this->option('mark');

    $string = 'Hello '.$name;

    if($mark)

        $string .= $mark;

    echo $string."\n";

}

这样我们在控制台输入如下Artisan命令:

1

php artisan laravel:academy

对应输出为:

1

Hello LaravelAcademy!

再运行如下Artisan命令:

1

php artisan laravel:academy Laravel --mark=?

对应输出为:

1

Hello Laravel?

输入提示

我们甚至还可以完全让用户通过在控制台输入name来获取输入参数,首先修改handle方法如下:

1

2

3

4

5

public function handle()

{

    $name = $this->ask('What do you want to say Hello?');

    echo "Hello ".$name."\n";

}

然后在终端输入php artisan laravel:academy,交互页面如下:
2015-10-19_224643.jpg

如果是输入密码一类的敏感信息可以用secret替代ask方法。
有时候我们会根据用户的意愿选择继续还是中止:

1

2

3

4

5

6

7

8

public function handle()

{

    if($this->confirm('Do you want to continue?[y|n]')){

        $this->info("Continue");

    }else{

        $this->error("Interrupt");

    }

}

对应输出为:

2015-10-19_232437.jpg

除了让用户手动输入外,还可以使用anticipate方法实现自动完成功能:

1

2

3

4

5

public function handle()

{

    $name = $this->anticipate('What is your name?', ['Laravel', 'Academy']);

    $this->info($name);

}

当然还可以使用choice方法为用户提供选择避免手动输入,用户只需选择对应索引即可:

1

2

3

4

5

public function handle()

{

    $name = $this->choice('What is your name?', ['Laravel', 'Academy']);

    $this->info($name);

}

对应交互页面如下:

2015-10-19_233106.jpg

编写输出

关于输出字符串,上面我们简单使用了echo语句,其实Laravel提供了更为强大和多样化的方法:

1

2

3

4

5

6

7

public function handle()

{

    $this->info("Successful!");

    $this->error("Something Error!");

    $this->question("What do you want to do?");

    $this->comment("Just Comment it!");

}

执行php artisan laravel:academy对应输出如下:

2015-10-19_225422.jpg

表格

Artisan甚至可以输出表格:

1

2

3

4

5

6

public function handle()

{

    $headers = ['Name', 'Email'];

    $users = \App\User::all(['name', 'email'])->toArray();

    $this->table($headers, $users);

}

执行php artisan laravel:academy对应输出为:

2015-10-19_225643.jpg

进度条

当然对于复杂耗时的命令,进度条是必不可少的,

1

2

3

4

5

6

7

8

9

public function handle()

{

    $this->output->progressStart(10);

    for ($i = 0; $i < 10; $i++) {

        sleep(1);

        $this->output->progressAdvance();

    }

    $this->output->progressFinish();

}

执行php artisan laravel:academy对应输出为:

2015-10-19_230505.jpg

5、从CLI之外调用Artisan

除了在控制台执行Artisan命令之外,还可以通过代码在别处调用Artisan命令,比如其它Artisan命令、控制器、路由或其他。

路由

在路由闭包中我们可以通过Artisan门面的call方法来调用本节创建的命令:

1

2

3

4

5

6

//在路由中调用Artisan命令

Route::get('testArtisan',function(){

    $exitCode = Artisan::call('laravel:academy', [

        'name' => 'Laravel学院', '--mark' => '!'

    ]);

});

其它Artisan命令

在一个Artisan命令中也可以调用另一个Artisan命令,还是通过call方法:

1

2

3

4

public function handle()

{

    $this->call('inspire');

}

如果想要调用一个Artisan命令并阻止其所有输出,可以使用callSilent方法:

1

2

3

4

public function handle()

{

    $this->callSilent('inspire');

}

除此之外,关于Artisan命令你还应该知道的是我们可以在创建的命令类的控制器或方法中注入任何依赖。这就意味着我们可以在命令类中使用注册到服务容器的所有类。

相关推荐:

laravel框架的启动过程分析

Laravel框架内置的Broadcast功能如何实现与客户端实时通信

以上就是Laravel 5.1框架中如何创建自定义Artisan控制台命令的详细内容,更多请关注php中文网其它相关文章!

这篇关于Laravel 5.1框架中如何创建自定义Artisan控制台命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”