Laravel 5软件包计划任务

时间:2016-03-07 01:09:24

标签: laravel laravel-5

我正在开发一个包含一些计划任务的程序包 - 是否有注册/发布它们的方式而不会影响已设置计划任务的基本应用程序?

我不想覆盖App/Console/Kernel.php,因为基本应用程序可能已经拥有了自己的计划任务等。

2 个答案:

答案 0 :(得分:10)

你当然可以,通过一些基本的面向对象编程的力量!

第1步:创建您的包"内核"控制台类

让我们在您的软件包的控制台目录中创建一个Kernal类,我们将在其中扩展App\Console\Kernel

<?php
namespace Acme\Package\Console;

use App\Console\Kernel as ConsoleKernel;
use Illuminate\Console\Scheduling\Schedule;

class Kernel extends ConsoleKernel
{
    //
}

第2步:添加schedule方法

由于我们正在扩展App Console内核,因此我们要添加相关的调度方法并调用父类&#39;实施它。这将确保任何先前安排的任务完成。

<?php
namespace Acme\Package\Console;

use App\Console\Kernel as ConsoleKernel;
use Illuminate\Console\Scheduling\Schedule;

class Kernel extends ConsoleKernel
{
    /**
     * Define the package's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        parent::schedule($schedule);

        //
    }
}

第3步:添加计划任务

现在您可以按常规添加自己的计划任务。

$schedule->command('')->daily();

第4步:注册它!

我们希望将类绑定到容器,并在我们的包的服务提供商的make方法中register

$this->app->singleton('acme.package.console.kernel', function($app) {
    $dispatcher = $app->make(\Illuminate\Contracts\Events\Dispatcher::class);
    return new \Acme\Package\Console\Kernel($app, $dispatcher);
});

$this->app->make('acme.package.console.kernel');

这应该是所有必需的!

有些事情要考虑到这一点:

  1. 预先知道您的软件包有这些捆绑的任务。开发人员不喜欢惊喜(特别是当它涉及在服务器上自动运行任务时)。
  2. 除了第一点,并不是每个人都会在他们的服务器上设置所需的cronjob。在您的软件包的任务自动运行之前,他们需要这样做。
  3. 提供配置选项以禁用自动注册包的任务,并提供有关开发人员如何根据自己的需求自行注册的文档。

答案 1 :(得分:-1)

在您的包裹服务提供商中,执行以下操作:

/** @var array list of commands to be registered in the service provider */
protected $moreCommands = [
    \My\Package\CommandOne::class,
    \My\Package\CommandTwo::class,
    \My\Package\CommandThree::class,
];

然后在服务提供者的boot()方法中执行以下操作:

$this->commands($this->moreCommands);

非常好的问题,顺便说一下。让我搜索Laravel API文档以找到答案,当我找到它时,我在我自己的软件包中实现了它。