Legjobb composer csomagok: dátumkezelés a cakephp/chronos-szal

  • php
  • composer
  • dátumok
  • legjobb composer csomagok

Előszó

Eléggé elhanyagoltam a blogom az elmúlt néhány évben, főleg amióta a Sztakiban dolgozom. Jó sok dologgal megismerkedtem közben, meg hát az informatika és a webes technológiák is változtak közben. Éppen itt az ideje, hogy ismét felvegyem a fonalat, és ellássam tartalommal szeretett kis blogom.

TLDR; goto cool példák

Legjobb composer csomagok

A legjobb Drupal modulok sorozatom elég népszerű volt, sok visszajelzés érkezett azokra a bejegyzésekre. Mivel a 8-as verzió óta már a Drupal is Composer-t használ, azért úgy gondolom ez egy jó téma, amivel érdemes foglalkozni.

Dátumkezelés

Aki fél évnél többet programozott már életében, az valószínűleg belefutott már a dátumok, időpontok és időzónák örökzöld problémájába. Nem elég, hogy vannak nekünk időzónáink – amelyek folyton változnak, téli és nyári időszámításunk és szökőéveink. Mindezekhez, szinte már desszertként, csatlakoznak a szökő-másodpercek is.

Meg sem próbálom ebben a bejegyzésben – vagy bárhol máshol – mindenre kiterjedő leírást adni a dátumok kezeléséhez, a fentiekkel inkább csak érzékeltetni akartam a probléma összetettségét.

Dátumok PHP alatt

A PHP beépített dátum kezelő függvényei kissé suták, egyszerűek. Teszik a dolgukat ugyan, de egy modern OO környezetben egyáltalán nem állnak kézre. Szerencsére van megoldás, két népszerű composer csomag formájában.

A legnépszerűbb a nesbot/carbon nevű csomag, amely messze a legnagyobb telepítési bázissal rendelkezik. Én viszont egy másik csomagot szeretnék bemutatni, a CakePHP közösség Chronos csomagját.

Miért cakephp/chronos?

A csomag kezdőoldala két olyan érvet is említ, amik engem is meggyőztek.

Az objektumok megváltoztathatatlanok, azaz Immutable objektumok. Magam is belefutottam már abba, hogy egy általam használt, de külső fejlesztők által írt, vagy akár ténylegesen általam írt kód megváltoztatott egy dátumot, mert az adott kontextusban már nem volt jelentősége a régi értéknek. Igen ám, de a hívó még szeretett volna dolgozni a régi értékkel, miközben az már nem állt rendelkezésre. Szokásomhoz híven szeretek általános következtetést is levonni, ha lehet. És itt lehet. A probléma abból ered, hogy intuitíven a dátumra vagy időpontra úgy gondolunk, mint egy egyszerű érték, mint egy sima skaláris változó, egy integer vagy egy string. Viszont a dátumok összetett struktúrák, ld.: időzóna, szökőév, stb… Ezért aztán kódoláskor – nem tudatosan – azt feltételezzük, hogy érték szerint vannak átadva, nem pedig referencia szerint. Ez okozza a galibát, és pontosan ezt a viselkedést idézi elő a megváltoztathatatlan, azaz immutable viselkedés. Hozzáteszem, hogy a Chronos objektumok tudnak megváltoztathatóak lenni, csak kérni kell tőlük.

A másik csak kényelmi faktor, de szerintem szintén fontos, hogy lehet csak dátumokat kezelni. A Chronos csomag ad nekünk egy Date osztályt, aminek nincsen időpont komponense.

A harmadik ok szubjektív, amiért én anno a Chronos mellett döntöttem a Carbon ellenében. Belenéztem mindkettő kódjába, és az előbbi egyszerűen jobb minőségűnek, modernebbnek tűnt. Mint mondtam, ez szubjektív, de azért érdemes egy pillantást vetni a két kódbázisra, mielőtt elkötelezzük magunkat. Sőt, ha már használjuk a Carbon-t, akkor is, mert bizony nagyon könnyű áttérni. A Chronos ad egy segéd szkriptet is, amivel átírhatjuk a kódunkat automatikusan. Mondjuk én ezt nem próbáltam ki.

Telepítés

Ezen nincs mit cifrázni, így kell:

composer require cakephp/chronos

Példák a használatra

Néhány példa, ami nekem nagy segítség volt. További rengeteg példa emerre:

https://book.cakephp.org/3.0/en/chronos.html

A nap, hét, hónap, év utolsó másodperce:

$time = Chronos::now();
$time->endOfDay();
$time->endOfWeek();
$time->endOfMonth();
$time->endOfYear();

Következő péntek – ki ne lenne erre kícsi ?! :)

$time->next(ChronosInterface::FRIDAY);

Hétvége van már?

$now->isWeekend();

Különbség számítás:

$first->diffInHours($second);
$first->diffInDays($second);
$first->diffInWeeks($second);
$first->diffInYears($second);

Dátum formátumok:

$time->toRssString();
$time->toAtomString();
$time->toIso8601String();

Dokumentáció

Áttekintés, sok példával (fentieket is innen másoltam):
https://book.cakephp.org/3.0/en/chronos.html
API dokumentáció:
https://api.cakephp.org/chronos/1.0/

Összegzés

Én sokáig azt hittem, hogy semmi szükség ilyen csomagra, bőven elég amit a PHP ad. Aztán miután először használtam, be kellett látnom, hogy sokkal karbantarthatóbb és megbízhatóbb kódot lehet írni ezen csomagok használatával.

Örülnék, ha más is megosztaná a véleményét, használta-e valaki a Chronos-t vagy a Carbon-t.