我正在开发一个包含一些计划任务的包--有什么方法可以在不影响已经设置计划任务的基础应用程序的情况下注册/发布它们吗?
我不想覆盖App/Console/Kernel.php,因为基本应用程序可能已经有了它自己的预定任务等等。
发布于 2016-03-18 23:56:25
你当然可以,通过一些基本的面向对象编程的力量!
步骤1:创建包的“内核”控制台类
让我们在包的控制台目录中创建一个内核类,我们将在其中扩展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内核,因此需要添加相关的调度方法,并调用父类的实现。这将确保任何先前计划的任务都能顺利完成。
<?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();第四步:注册它!
我们希望将类绑定到容器,并将其绑定到包的服务提供者的make方法中:
$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');那应该是唯一需要的了!
尽管如此,还是要考虑到一些事情:
发布于 2016-03-07 07:08:27
在您的包服务提供商中,执行以下操作:
/** @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文档以找到答案,当我找到答案时,我在我自己的包中实现了它。
https://stackoverflow.com/questions/35834681
复制相似问题