7 22

Lumen中注册使用Artisan Console

Laravel中使用 Artisan Console 有详细的介绍。Laravel Artisan Console 官方文档,除了创建和注册 Artisan Console 与Lumen稍许不同外,其它内容基本都一样。

但是实际项目中,我更希望用Lumen的 Artisan Console 来执行一些简单的数据迁移、版本升级等操作。

下面就以官方文档中的示例来简单说一下Lumen中怎么注册使用 Artisan Console

创建 Artisan Console命令文件

Lumen创建命令只能通过手动创建文件。 在 app/Console/Commands 创建 SendEmails 用来编写命令:

<?php

namespace App\Console\Commands;

use App\User;
use App\DripEmailer;
use Illuminate\Console\Command;

class SendEmails extends Command{
    /**
     * 控制台命令名称
     *
     * @var string
     */
    protected $signature = 'email:send {user}';

    /**
     * 控制台命令描述
     *
     * @var string
     */
    protected $description = 'Send drip e-mails to a user';

    /**
     * The drip e-mail service.
     *
     * @var DripEmailer
     */
    protected $drip;

    /**
     * 创建新的命令实例
     *
     * @param  DripEmailer  $drip
     * @return void
     */
    public function __construct(DripEmailer $drip)
    {
        parent::__construct();
        $this->drip = $drip;
    }

    /**
     * 执行控制台命令
     *
     * @return mixed
     */
    public function handle()
    {
        $this->drip->send(User::find($this->argument('user')));
    }
}

命令编写具体方法请查看Laravel的官方文档 ,Lumen是一样的。

注册命令

Lumen与Laravel最主要的差异就在这里,Lumen需要自己写服务提供者来注册命令。 在 app/Providers 里创建一个新的服务提供者:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Console\Commands\SendEmails;

class SendEmailsServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('command.email.send', function () {
            return new SendEmails;
        });

        $this->commands('command.email.send');
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['command.email.send'];
    }
}

bootstrap/app.php 中注册服务提供者:

$app->register(App\Providers\ SendEmailsServiceProvider::class);

现在就大功告成,只需要执行 php artisan email:send XXX 就可以使用自己编写的命令了。