gpt4 book ai didi

Laravel 5 打包计划任务

转载 作者:行者123 更新时间:2023-12-04 17:33:15 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

让我们在包的 Console 目录中创建一个 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 Kernel,我们需要添加相关的 schedule 方法并调用它的父类的实现。这将确保任何先前计划的任务都能执行。

<?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 步:注册它!

我们希望将类绑定(bind)到容器, 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');

这应该就是所需要的!

不过,有一些事情需要考虑:
  • 预先知道您的包有这些捆绑的任务。开发人员不喜欢惊喜(尤其是当它涉及在他们的服务器上自动运行的任务时)。
  • 除了第一点,并不是每个人都会在他们的服务器上设置所需的 cronjob。他们需要在您的包的任务自动运行之前执行此操作。
  • 提供配置选项禁用 包的任务来自自动注册,以及开发人员如何根据自己的需要自行注册的文档。
  • 关于Laravel 5 打包计划任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834681/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com