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

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

Jul 31, 2018 am 11:39 AM

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

1、入门

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

php artisan list
登录后复制

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

2015-10-19_211849.jpg

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

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

php artisan help make:console
登录后复制

对应输出如下:

2015-10-19_212233.jpg

2、创建命令

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

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

php artisan make:console HelloLaravelAcademy --command=laravel:academy
登录后复制

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

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

<?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 = &#39;laravel:academy&#39;;
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;Command description.&#39;;
    /**
     * 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方法如下:

public function handle()
{
    echo "Hello LaravelAcademy\n";
}
登录后复制

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

3、运行命令

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

protected $commands = [
     ...  //其他命令类
     \App\Console\Commands\HelloLaravelAcademy::class
];
登录后复制

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

php artisan laravel:academy
登录后复制
登录后复制

终端就会打印出:

Hello LaravelAcademy
登录后复制

是不是很简单?

4、更多样的输入输出

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

定义输入

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

protected $signature = &#39;laravel:academy {name}&#39;;
登录后复制

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

{name?} //可选参数
{name=LaravelAcademy} //默认name值为LaravelAcademy
登录后复制

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

protected $signature = &#39;laravel:academy {name=LaravelAcademy}&#39;;
登录后复制

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

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark}&#39;;
登录后复制

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

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark=}&#39;;
登录后复制

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

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark=!}&#39;;
登录后复制

获取输入

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

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

$name = $this->argument(&#39;name&#39;);
登录后复制

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

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

$mark = $this->option(&#39;mark&#39;);
登录后复制

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

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

public function handle()
{
    $name = $this->argument(&#39;name&#39;);
    $mark = $this->option(&#39;mark&#39;);
    $string = 'Hello '.$name;
    if($mark)
        $string .= $mark;
    echo $string."\n";
}
登录后复制

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

php artisan laravel:academy
登录后复制
登录后复制

对应输出为:

Hello LaravelAcademy!
登录后复制

再运行如下Artisan命令:

php artisan laravel:academy Laravel --mark=?
登录后复制

对应输出为:

Hello Laravel?
登录后复制

输入提示

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

public function handle()
{
    $name = $this->ask(&#39;What do you want to say Hello?&#39;);
    echo "Hello ".$name."\n";
}
登录后复制

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

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

public function handle()
{
    if($this->confirm(&#39;Do you want to continue?[y|n]&#39;)){
        $this->info("Continue");
    }else{
        $this->error("Interrupt");
    }
}
登录后复制

对应输出为:

2015-10-19_232437.jpg

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

public function handle()
{
    $name = $this->anticipate(&#39;What is your name?&#39;, [&#39;Laravel&#39;, &#39;Academy&#39;]);
    $this->info($name);
}
登录后复制

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

public function handle()
{
    $name = $this->choice(&#39;What is your name?&#39;, [&#39;Laravel&#39;, &#39;Academy&#39;]);
    $this->info($name);
}
登录后复制

对应交互页面如下:

2015-10-19_233106.jpg

编写输出

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

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甚至可以输出表格:

public function handle()
{
    $headers = [&#39;Name&#39;, &#39;Email&#39;];
    $users = \App\User::all([&#39;name&#39;, &#39;email&#39;])->toArray();
    $this->table($headers, $users);
}
登录后复制

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

2015-10-19_225643.jpg

进度条

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

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方法来调用本节创建的命令:

//在路由中调用Artisan命令
Route::get(&#39;testArtisan&#39;,function(){
    $exitCode = Artisan::call(&#39;laravel:academy&#39;, [
        &#39;name&#39; => &#39;Laravel学院&#39;, &#39;--mark&#39; => &#39;!&#39;
    ]);
});
登录后复制

其它Artisan命令

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

public function handle()
{
    $this->call(&#39;inspire&#39;);
}
登录后复制

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

public function handle()
{
    $this->callSilent(&#39;inspire&#39;);
}
登录后复制

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

相关推荐:

laravel框架的启动过程分析

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

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

django或laravel哪个更好? django或laravel哪个更好? Mar 28, 2025 am 10:41 AM

Django和Laravel都是全栈框架,Django适合Python开发者和复杂业务逻辑,Laravel适合PHP开发者和优雅语法。1.Django基于Python,遵循“电池齐全”哲学,适合快速开发和高并发。2.Laravel基于PHP,强调开发者体验,适合小型到中型项目。

Laravel和后端:为Web应用程序提供动力逻辑 Laravel和后端:为Web应用程序提供动力逻辑 Apr 11, 2025 am 11:29 AM

Laravel是如何在后端逻辑中发挥作用的?它通过路由系统、EloquentORM、认证与授权、事件与监听器以及性能优化来简化和增强后端开发。1.路由系统允许定义URL结构和请求处理逻辑。2.EloquentORM简化数据库交互。3.认证与授权系统便于用户管理。4.事件与监听器实现松耦合代码结构。5.性能优化通过缓存和队列提高应用效率。

哪个是更好的PHP或Laravel? 哪个是更好的PHP或Laravel? Mar 27, 2025 pm 05:31 PM

PHP和Laravel不是直接可比的,因为Laravel是基于PHP的框架。1.PHP适合小型项目或快速原型开发,因其简单直接。2.Laravel适合大型项目或高效开发,因其提供丰富功能和工具,但学习曲线较陡,性能可能不如纯PHP。

Laravel是前端还是后端? Laravel是前端还是后端? Mar 27, 2025 pm 05:31 PM

laravelisabackendframeworkbuiltonphp,设计ForweBapplicationDevelopment.itfocusessonserver-sideLogic,databasemagemention和Applicationstructure和CanBeintegratedWithFrontendTechnologiesLikeLikeVue.jsorreActeReacterVue.jsorreActforforfull-stackDevefloct。

laravel入门实例 laravel入门实例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

Laravel的多功能性:从简单站点到复杂系统 Laravel的多功能性:从简单站点到复杂系统 Apr 13, 2025 am 12:13 AM

选择Laravel开发项目是因为其灵活性和强大功能适应不同规模和复杂度的需求。Laravel提供路由系统、EloquentORM、Artisan命令行等功能,支持从简单博客到复杂企业级系统的开发。

Laravel如何学习 怎么免费学习Laravel Laravel如何学习 怎么免费学习Laravel Apr 18, 2025 pm 12:51 PM

想要学习 Laravel 框架,但苦于没有资源或经济压力?本文为你提供了免费学习 Laravel 的途径,教你如何利用网络平台、文档和社区论坛等资源,从入门到掌握,为你的 PHP 开发之旅奠定坚实基础。

为什么Laravel如此受欢迎? 为什么Laravel如此受欢迎? Apr 02, 2025 pm 02:16 PM

Laravel受欢迎的原因包括其简化开发过程、提供愉快的开发环境和丰富的功能。1)它吸收了RubyonRails的设计理念,结合PHP的灵活性。2)提供了如EloquentORM、Blade模板引擎等工具,提高开发效率。3)其MVC架构和依赖注入机制使代码更加模块化和可测试。4)提供了强大的调试工具和性能优化方法,如缓存系统和最佳实践。

See all articles