wpcmf: wpcmf cms ,内容管理系统,类似 wordpress 系统
Laravel 有一些非常有用的方法可以让我们自定义何时执行命令。不幸的是,有时我们需要更多的控制,而 Laravel 并没有开箱即用。
例如,当您需要每个工作日执行命令时,这意味着每个工作日,但不包括假期。您不希望您的同事(或您自己)在圣诞节早上收到每天的电子邮件。
在本文中,我将向您展示如何做到这一点。
避开周末
Laravel 默认自带 helper 方法weekdays
来配置 schedule 命令只在工作日执行。假设我们有一个带有签名的命令send:daily-email
,并且我们希望这个命令只在工作日(周一到周五)发送,我们可以通过将它添加到我们schedule
的控制台内核中的方法来很容易地做到这一点:
// app/Console/Kernel.php
class Kernel extends ConsoleKernel
{
//...
protected function schedule(Schedule $schedule)
{
$schedule->command('send:daily-email')->weekdays();
}
//...
}
就是这样,我们只需要调用weekdays
命令上的方法,Laravel 只会在工作日自动执行它。
现在我们有工作日了。我们需要弄清楚如何确保 Laravel 跳过假期。
跳过假期
为此,我们将在 schedule 命令中使用 skip 方法。此方法执行作为参数传递的函数,如果该函数返回 true,则跳过该执行。这样我们就可以检查当天是否是假期。
现在我们需要弄清楚今天是不是假期。有很多方法可以做到这一点,但是有一个库可以通过向 Carbon 添加一个 mixin 来帮助我们解决这个问题。您可以在此处阅读更多相关信息:https ://github.com/kylekatarnls/business-day
使用 composer 安装库:
composer require cmixin/business-day
安装后,我们需要在服务提供者中启用 mixin。AppServiceProvider 是一个很好的地方。
// app/Providers/AppServiceProvider.php
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Carbon;
use Cmixin\BusinessDay;
class AppServiceProvider extends ServiceProvider
{
// ...
public function boot()
{
BusinessDay::enable(Carbon::class);
}
}
在boot
服务提供者的方法中,我们调用类的enable
方法BusinessDay
,它是我们刚刚安装的库的一部分。我们还需要传递我们将添加额外方法的类。Illuminate\Support\Carbon
。
现在我们需要告诉图书馆我们正在使用哪个地区的假期。您可以在此处找到所有支持的区域:https ://github.com/kylekatarnls/business-day/tree/master/src/Cmixin/Holidays
例如,我打算利用美国的假日。这意味着我要查找的文件是us-national.php
,我们将使用该文件名来配置我们的假期。
public function boot()
{
BusinessDay::enable(Carbon::class);
Carbon::setHolidaysRegion('us-national');
}
就是这样,现在我们可以通过调用isHoliday
carbon 实例上的方法来知道一天是否是假期,例如:
now()->isHoliday();
把它们放在一起
我们现在可以通过将假期检查添加到我们的跳过方法来完成我们的命令配置:
protected function schedule(Schedule $schedule)
{
$schedule->command('send:daily-email')->weekdays()->skip(function () {
return now()->isHoliday();
});
}