Installation
composer require azuyalabs/yasumi
Add the service provider to config/app.php (if not auto-discovered):
'providers' => [
Yasumi\YasumiServiceProvider::class,
],
First Use Case: Basic Holiday Calculation
use Yasumi\Yasumi;
$holidays = Yasumi::create('US', 'en_US');
$holidays->setDate(new DateTime('2023-12-25')); // Christmas
$isHoliday = $holidays->isHoliday(); // true
Key Files to Explore
vendor/azuyalabs/yasumi/src/Yasumi.php (Core class)vendor/azuyalabs/yasumi/src/Providers/YasumiServiceProvider.php (Service provider)vendor/azuyalabs/yasumi/src/Exceptions/ (Error handling)// Initialize for a country (e.g., Japan)
$holidays = Yasumi::create('JP', 'ja_JP');
// Check if a date is a holiday
$isHoliday = $holidays->isHoliday(new DateTime('2023-01-01')); // New Year's Day
// Get all holidays for a year
$holidaysList = $holidays->holidays();
// Add a custom holiday (e.g., company-specific)
$holidays->addHoliday('Company Anniversary', new DateTime('2023-05-15'));
// Remove a default holiday (e.g., override a national holiday)
$holidays->removeHoliday('US', 'Independence Day');
// Skip jobs on holidays (e.g., in a scheduled task)
if ($holidays->isHoliday()) {
$this->skipIfHoliday();
}
// Set timezone and locale
$holidays = Yasumi::create('DE', 'de_DE', 'Europe/Berlin');
// Generate holidays for a range of years
$holidays->setDateRange(new DateTime('2023-01-01'), new DateTime('2024-12-31'));
$holidaysList = $holidays->holidays();
Use the Yasumi facade for cleaner syntax:
use Yasumi\Facades\Yasumi as YasumiFacade;
$isHoliday = YasumiFacade::create('GB')->isHoliday();
Cache holiday lists to improve performance:
$cachedHolidays = Cache::remember('holidays_'.date('Y'), now()->addYear(), function () {
return Yasumi::create('US')->holidays();
});
Store country codes in a database and fetch dynamically:
$countryCode = $user->country_code;
$holidays = Yasumi::create($countryCode);
Return formatted holiday data in API responses:
return response()->json([
'holidays' => collect(Yasumi::create('CA')->holidays())
->map(fn ($holiday) => [
'name' => $holiday->name,
'date' => $holiday->date->format('Y-m-d'),
])
->values()
]);
Date Handling Quirks
DateTime objects, so ensure your input dates are timezone-aware.$holidays = Yasumi::create('US', 'en_US', 'America/New_York');
$holidays->setDate(new DateTime('2023-11-23', new DateTimeZone('UTC'))); // May fail
Fix: Use the same timezone as the Yasumi instance.Holiday Overrides
addHoliday() are not persisted. Re-add them if the Yasumi instance is recreated.$holidays = Yasumi::create('US');
$holidays->addHoliday('Custom Day', new DateTime('2023-10-10'));
// Later...
$holidays = Yasumi::create('US'); // Custom holiday is lost!
Fix: Store custom holidays in a database or config file.Locale-Specific Names
$holidays = Yasumi::create('FR', 'fr_FR');
$holiday = $holidays->getHoliday(new DateTime('2023-07-14')); // "Fête Nationale"
$holidays->setLocale('en_US');
$holiday->name; // Still "Fête Nationale" (not updated dynamically)
Fix: Re-fetch holidays after changing the locale.Performance with Large Date Ranges
Static Method Caching
Yasumi::create()). Reusing the same country/locale may return cached data.$holidays1 = Yasumi::create('US');
$holidays2 = Yasumi::create('US'); // May return cached data
Check Holiday Existence
Use hasHoliday() to verify if a holiday exists before checking:
if ($holidays->hasHoliday(new DateTime('2023-12-25'))) {
$holiday = $holidays->getHoliday(new DateTime('2023-12-25'));
}
Inspect Holiday Data Dump holiday objects to debug:
dd($holidays->holidays()); // View all holidays
dd($holidays->getHoliday(new DateTime('2023-01-01'))->toArray());
Enable Yasumi Logging Add debug logging for holiday calculations:
Yasumi::setLogger(function ($message) {
\Log::debug($message);
});
Validate Country Codes
Ensure country codes are correct (e.g., 'US' vs 'USA'). Use Yasumi::supportedCountries() to list valid codes.
Custom Holiday Providers Extend Yasumi by creating custom holiday providers:
use Yasumi\Holiday\HolidayProviderInterface;
class CompanyHolidayProvider implements HolidayProviderInterface
{
public function getHolidays(Yasumi $yasumi)
{
return [
new Holiday('Team Building Day', new DateTime('2023-09-15')),
];
}
}
// Register the provider
Yasumi::addHolidayProvider(new CompanyHolidayProvider());
Override Default Holidays Replace default holidays for a country:
Yasumi::overrideHolidays('US', [
new Holiday('Custom Thanksgiving', new DateTime('2023-11-23')),
]);
Add Custom Holiday Types
Extend the Holiday class or create a decorator:
class ExtendedHoliday extends Holiday
{
public function isCompanyHoliday()
{
return in_array($this->name, ['Company Anniversary', 'Team Day']);
}
}
// Use in custom logic
$holiday = $holidays->getHoliday(new DateTime('2023-05-15'));
if ($holiday instanceof ExtendedHoliday && $holiday->isCompanyHoliday()) {
// Handle company-specific logic
}
Integrate with Laravel Events Trigger events when holidays are detected:
event(new HolidayDetected($holiday));
Localization Hooks Override holiday names or descriptions dynamically:
Yasumi::setHolidayNameOverride('US',
How can I help you explore Laravel packages today?