首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5包计划任务

Laravel 5包计划任务
EN

Stack Overflow用户
提问于 2016-03-07 01:09:24
回答 2查看 2.1K关注 0票数 7

我正在开发一个包含一些计划任务的包--有什么方法可以在不影响已经设置计划任务的基础应用程序的情况下注册/发布它们吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-18 23:56:25

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

步骤1:创建包的“内核”控制台类

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

代码语言:javascript
复制
<?php
namespace Acme\Package\Console;

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

class Kernel extends ConsoleKernel
{
    //
}

步骤2:添加schedule方法

由于我们正在扩展App内核,因此需要添加相关的调度方法,并调用父类的实现。这将确保任何先前计划的任务都能顺利完成。

代码语言:javascript
复制
<?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:添加计划的任务

现在,您可以按照正常情况添加您自己的计划任务。

代码语言:javascript
复制
$schedule->command('')->daily();

第四步:注册它!

我们希望将类绑定到容器,并将其绑定到包的服务提供者的make方法中:

代码语言:javascript
复制
$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. 提供一个配置选项,用于禁用包的任务,使其无法自动注册,并提供关于开发人员如何根据自己的需要自己注册它的文档。
票数 13
EN

Stack Overflow用户

发布于 2016-03-07 07:08:27

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

代码语言:javascript
复制
/** @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()方法中执行以下操作:

代码语言:javascript
复制
$this->commands($this->moreCommands);

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35834681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档