Dato/klokkeslæt værdier bliver alle castet til den samme basisstruktur, det vil sige en DateTime
eller DateTimeImmutable
objekt, og derfor vil værdier med kun dato naturligvis have en tidsværdi tilføjet (00:00:00
), og tidsværdier kommer med en dato (den aktuelle dato).
CakePHP vil bruge specifikke underklasser afhængigt af SQL-datatypen, det vil sige
\Cake\I18n\Time
eller\Cake\I18n\FrozenTime
iTIME
,TIMESTAMP
ogDATETIME
\Cake\I18n\Date
eller\Cake\I18n\FrozenDate
forDATE
I tidligere versioner af CakePHP 3 var der kun \Cake\I18n\Time
.
Det ville være rart, hvis der ville være en separat klasse for kun tidsbegrænsede typer, som ville have et ordentligt standard outputformat indstillet til kun tidsbegrænset, men indtil sådan noget tilføjes, skal du selv sørge for outputformatet .
Formatér i dine visninger
Det er op til dig, hvordan du viser dette i dine visninger. Du kan nemt bruge i18nFormat()
metoden for Time
klasseforekomst
$record['start_time']->i18nFormat(
[\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)
eller Time
hjælper, for kun at vise tidsdelen
$this->Time->i18nFormat(
$record['start_time'],
[\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)
Tror det ikke ville skade, hvis bake ville generere lignende kode i henhold til kolonnens type. Du kan eventuelt foreslå det som en forbedring . Som nævnt kan det også være værd at overveje at bruge yderligere klasser (eller måske muligheder) for tidsbestemte kolonner.
Brug en tilpasset tidsklasse
Hvis du ville have denne adfærd overalt, hvor strengrepræsentationen af objektet bliver brugt, uden at skulle aktivere formateringsværktøjet manuelt, så kunne du gøre brug af en udvidet \Cake\I18n\Time
eller \Cake\I18n\FrozenTime
klasse med en tilsidesat $_toStringFormat
egenskab, så den formaterer datoen i overensstemmelse hermed.
src/I18n/FrozenTimeOnly.php
namespace App\I18n;
use Cake\I18n\FrozenTime;
class FrozenTimeOnly extends FrozenTime
{
protected static $_toStringFormat = [
\IntlDateFormatter::NONE,
\IntlDateFormatter::SHORT
];
}
src/config/bootstrap.php
use Cake\Database\Type\TimeType;
use App\I18n\FrozenTimeOnly;
TimeType::$dateTimeClass = FrozenTimeOnly::class;
// remove the default `useImmutable()` call, you may however
// want to keep further calls for formatting and stuff
Type::build('time');
// ...
Dette burde stort set være selvforklarende, time
kolonner, der tilknyttes TimeType
, vil nu bruge App\I18n\FrozenTimeOnly
i stedet for standard Cake\I18n\Time
.
DateTimeType::$dateTimeClass
er forældet
For at klare det, vil en brugerdefineret databasetype være påkrævet, hvilket også er ret simpelt.
src/Database/Type/TimeOnlyType.php
namespace App\Database\Type;
use App\I18n\FrozenTimeOnly;
use Cake\Database\Type\TimeType;
class TimeOnlyType extends TimeType
{
public function __construct($name)
{
parent::__construct($name);
$this->_setClassName(FrozenTimeOnly::class, \DateTimeImmutable::class);
}
}
Det skal bemærkes, at dette i øjeblikket vil instansiere en data/tidsklasse to gange, da den overordnede konstruktør vil kalde _setClassName()
også, hvilket er hvor en instans af den givne klasse vil blive instansieret.
src/config/bootstrap.php
use App\Database\Type\TimeOnlyType;
Type::map('time', TimeOnlyType::class);
Så hvad dette vil gøre, er at tilsidesætte standard time
skriv mapping for at bruge den tilpassede \App\Database\Type\TimeOnlyType
klasse, som igen vil bruge \App\I18n\TimeOnly
klasse, når databaseværdier konverteres til PHP-objekter, som, når de konverteres til en streng, vil bruge kun tidsformatet.
Se også
- Kogebog> Tid> Indstilling af standardlokalitet og formatstreng
- Kogebog> Database Adgang og ORM> Grundlæggende oplysninger om database> Tilføjelse af brugerdefinerede typer