Rumah rangka kerja 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
Salin selepas log masuk

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

2015-10-19_211849.jpg

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

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

php artisan help make:console
Salin selepas log masuk

对应输出如下:

2015-10-19_212233.jpg

2、创建命令

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

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

php artisan make:console HelloLaravelAcademy --command=laravel:academy
Salin selepas log masuk

其中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()
    {
        //
    }
}
Salin selepas log masuk

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

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

public function handle()
{
    echo "Hello LaravelAcademy\n";
}
Salin selepas log masuk

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

3、运行命令

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

protected $commands = [
     ...  //其他命令类
     \App\Console\Commands\HelloLaravelAcademy::class
];
Salin selepas log masuk

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

php artisan laravel:academy
Salin selepas log masuk
Salin selepas log masuk

终端就会打印出:

Hello LaravelAcademy
Salin selepas log masuk

是不是很简单?

4、更多样的输入输出

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

定义输入

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

protected $signature = &#39;laravel:academy {name}&#39;;
Salin selepas log masuk

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

{name?} //可选参数
{name=LaravelAcademy} //默认name值为LaravelAcademy
Salin selepas log masuk

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

protected $signature = &#39;laravel:academy {name=LaravelAcademy}&#39;;
Salin selepas log masuk

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

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark}&#39;;
Salin selepas log masuk

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

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark=}&#39;;
Salin selepas log masuk

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

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark=!}&#39;;
Salin selepas log masuk

获取输入

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

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

$name = $this->argument(&#39;name&#39;);
Salin selepas log masuk

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

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

$mark = $this->option(&#39;mark&#39;);
Salin selepas log masuk

同理,无参调用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";
}
Salin selepas log masuk

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

php artisan laravel:academy
Salin selepas log masuk
Salin selepas log masuk

对应输出为:

Hello LaravelAcademy!
Salin selepas log masuk

再运行如下Artisan命令:

php artisan laravel:academy Laravel --mark=?
Salin selepas log masuk

对应输出为:

Hello Laravel?
Salin selepas log masuk

输入提示

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

public function handle()
{
    $name = $this->ask(&#39;What do you want to say Hello?&#39;);
    echo "Hello ".$name."\n";
}
Salin selepas log masuk

然后在终端输入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");
    }
}
Salin selepas log masuk

对应输出为:

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);
}
Salin selepas log masuk

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

public function handle()
{
    $name = $this->choice(&#39;What is your name?&#39;, [&#39;Laravel&#39;, &#39;Academy&#39;]);
    $this->info($name);
}
Salin selepas log masuk

对应交互页面如下:

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!");
}
Salin selepas log masuk

执行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);
}
Salin selepas log masuk

执行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();
}
Salin selepas log masuk

执行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;
    ]);
});
Salin selepas log masuk

其它Artisan命令

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

public function handle()
{
    $this->call(&#39;inspire&#39;);
}
Salin selepas log masuk

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

public function handle()
{
    $this->callSilent(&#39;inspire&#39;);
}
Salin selepas log masuk

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

相关推荐:

laravel框架的启动过程分析

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

Atas ialah kandungan terperinci Laravel 5.1框架中如何创建自定义Artisan控制台命令. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Mana yang lebih baik, Django atau Laravel? Mana yang lebih baik, Django atau Laravel? Mar 28, 2025 am 10:41 AM

Kedua-dua Django dan Laravel adalah kerangka kerja penuh. Django sesuai untuk pemaju python dan logik perniagaan yang kompleks, manakala Laravel sesuai untuk pemaju PHP dan sintaks elegan. 1.Django didasarkan pada python dan mengikuti falsafah "lengkap bateri", sesuai untuk perkembangan pesat dan kesesuaian yang tinggi. 2. Laravel didasarkan pada PHP, menekankan pengalaman pemaju, dan sesuai untuk projek kecil dan sederhana.

Laravel dan backend: Powering Web Application Logic Laravel dan backend: Powering Web Application Logic Apr 11, 2025 am 11:29 AM

Bagaimanakah Laravel memainkan peranan dalam logik backend? Ia memudahkan dan meningkatkan pembangunan backend melalui sistem penghalaan, eloquentorm, pengesahan dan kebenaran, acara dan pendengar, dan pengoptimuman prestasi. 1. Sistem penghalaan membolehkan definisi struktur URL dan logik pemprosesan permintaan. 2.eloquentorm memudahkan interaksi pangkalan data. 3. Sistem pengesahan dan kebenaran adalah mudah untuk pengurusan pengguna. 4. Acara dan pendengar melaksanakan struktur kod yang ditambah dengan longgar. 5. Pengoptimuman prestasi meningkatkan kecekapan aplikasi melalui caching dan beratur.

PHP atau Laravel mana yang lebih baik? PHP atau Laravel mana yang lebih baik? Mar 27, 2025 pm 05:31 PM

PHP dan Laravel tidak dapat dibandingkan secara langsung, kerana Laravel adalah rangka kerja berasaskan PHP. 1.Php sesuai untuk projek kecil atau prototaip cepat kerana ia mudah dan langsung. 2. Laravel sesuai untuk projek besar atau pembangunan yang cekap kerana ia menyediakan fungsi dan alat yang kaya, tetapi mempunyai lengkung pembelajaran yang curam dan mungkin tidak sebaik php tulen.

Adakah Laravel adalah frontend atau backend? Adakah Laravel adalah frontend atau backend? Mar 27, 2025 pm 05:31 PM

LaravelisabackendFramWorkBuiltonPHP, Direka ForweBapplicationDevelopment.itfocusesonServer-Sidelogic, DatabaseManagement, andApplications Structure, andCanbeIntegratedWithFrontendTechnologiesLikeVue.jsorreactorfull-stackdevelopment.

Contoh Pengenalan Laravel Contoh Pengenalan Laravel Apr 18, 2025 pm 12:45 PM

Laravel adalah rangka kerja PHP untuk membina aplikasi web yang mudah. Ia menyediakan pelbagai ciri yang kuat termasuk: Pemasangan: Pasang Laravel CLI secara global dengan komposer dan buat aplikasi dalam direktori projek. Routing: Tentukan hubungan antara URL dan pengendali dalam laluan/web.php. Lihat: Buat pandangan dalam sumber/pandangan untuk menjadikan antara muka aplikasi. Integrasi Pangkalan Data: Menyediakan integrasi keluar-of-the-box dengan pangkalan data seperti MySQL dan menggunakan penghijrahan untuk membuat dan mengubah suai jadual. Model dan Pengawal: Model mewakili entiti pangkalan data dan proses pengawal permintaan HTTP.

Fleksibiliti Laravel: Dari laman web mudah ke sistem yang kompleks Fleksibiliti Laravel: Dari laman web mudah ke sistem yang kompleks Apr 13, 2025 am 12:13 AM

Projek Pembangunan Laravel telah dipilih kerana fleksibiliti dan kuasa untuk memenuhi keperluan saiz dan kerumitan yang berbeza. Laravel menyediakan sistem penghalaan, eloquentorm, baris perintah artisan dan fungsi lain, menyokong pembangunan dari blog mudah ke sistem peringkat perusahaan yang kompleks.

Cara Belajar Laravel Cara Belajar Laravel secara percuma Cara Belajar Laravel Cara Belajar Laravel secara percuma Apr 18, 2025 pm 12:51 PM

Mahu mempelajari rangka kerja Laravel, tetapi tidak mengalami sumber atau tekanan ekonomi? Artikel ini memberikan anda pembelajaran percuma Laravel, mengajar anda cara menggunakan sumber seperti platform dalam talian, dokumen dan forum komuniti untuk meletakkan asas yang kukuh untuk perjalanan pembangunan PHP anda dari mula menguasai.

Mengapa Laravel begitu popular? Mengapa Laravel begitu popular? Apr 02, 2025 pm 02:16 PM

Populariti Laravel termasuk proses pembangunan mudahnya, menyediakan persekitaran pembangunan yang menyenangkan, dan ciri -ciri yang kaya. 1) Ia menyerap falsafah reka bentuk Rubyonrails, menggabungkan fleksibiliti PHP. 2) Menyediakan alat seperti eloquentorm, enjin templat bilah, dan lain -lain untuk meningkatkan kecekapan pembangunan. 3) Mekanisme suntikan seni bina dan ketergantungan MVC menjadikan kod lebih modular dan boleh diuji. 4) Menyediakan alat debugging yang kuat dan kaedah pengoptimuman prestasi seperti sistem caching dan amalan terbaik.

See all articles