DateTime modifiers such as startOfSeason, isInSummer
Seasoncan be used as a service which can work with anyDateTimeorDateTimeImmutableobject or date strings (which includes any subclass such asCarbonorChronos).- Or it can be used as a mixin to call the methods directly on
Carbonobjects. - Mixin get automatically enabled on Laravel if auto-discovery is on.
(new \Season\Season)->isInSummer('2022-06-25')
(new \Season\Season)->isInSummer(new DateTimeImmutable('2022-06-25'))
(new \Season\Season)->isInSummer(Carbon::now())Methods are available from the class \Season\Season which is cheap to create,
so you can just call methods from a new class everytime.
As a good practice, it's recommended you import the class with use Season\Season;
at the beginning of the file:
use Season\Season;
(new Season)->isInSummer('2022-06-25');
(new Season)->isInSummer(new DateTimeImmutable('2022-06-25'));And also to keep the same instance to re-use multiple times:
use Season\Season;
$season = new Season();
$season->isInSummer('2022-06-25');
$season->isInSummer(new DateTimeImmutable('2022-06-25'));You can use dependency injection with your framework:
use Season\Season;
use Psr\Clock\ClockInterface;
class ProductController
{
public function new(Season $season, ClockInterface $clock)
{
$seasonName = $season->getSeason($clock->now())->getName();
}
}With Laravel it will be provided by default.
With Symfony, you'll have to register \Season\Season as a service and
so edit config/services.yaml the following way:
services:
_defaults:
# ensure you get the tag 'controller.service_arguments'
# if you need services to be available as controller
# methods arguments:
tags: [ 'controller.service_arguments' ]
# then add the class name as a service
Season\Season:Learn more from Symfony documentation: Configuring Services in the Container
use Carbon\Carbon;
use Cmixin\SeasonMixin;
// On Laravel, the mixin will be loaded by default.
// On other applications/framework, you can enable it with:
Carbon::mixin(SeasonMixin::class);
Carbon::parse('2022-06-25')->isInSummer();You can use mixin on CarbonImmutable, Carbon or any of
their subclasses.
If you use Laravel but don't want to enable Season mixin
globally for Carbon, you can remove it from auto-discovery using:
"extra": {
"laravel": {
"dont-discover": [
"cmixin/season"
]
}
},By default, Season is created with the following config:
[
3 => 20, // spring
6 => 21, // summer
9 => 22, // fall
12 => 21, // winter
]mapping the month (as key) with the day (as value) for each season start.
But you can pass a custom config with other days as long as the keys remain.
use Season\Season;
$season = new Season([
3 => 21, // spring
6 => 21, // summer
9 => 21, // fall
12 => 21, // winter
]);In Laravel, you can set the config in config/season.php which will apply to both the mixin and the service:
<?php return [
3 => 21, // spring
6 => 21, // summer
9 => 21, // fall
12 => 21, // winter
];When using Carbon mixin alone, you can still call setSeasonConfig() to
change the config globally:
Carbon::setSeasonConfig([
3 => 21, // spring
6 => 21, // summer
9 => 21, // fall
12 => 21, // winter
]);Or apply a config on specific call:
echo Carbon::now()->getSeason([
3 => 21, // spring
6 => 21, // summer
9 => 21, // fall
12 => 21, // winter
])->getName();With Symfony you can edit config/services.yaml to configure the service:
services:
Season\Season:
arguments:
$config:
3: 20
6: 12
9: 22
12: 21