zend-filter
zend-filter copied to clipboard
A DateTime filter
This is a new filter that returns DateTime
or (if desired) DateTimeImmutable
instances.
@gscscnd
Thank you for the pull request and contribution, but did you see the filter DateTimeFormatter
?
https://github.com/zendframework/zend-filter/blob/master/src/DateTimeFormatter.php
@froschdesign, it seems that DateTimeFormatter
returns a string, while I would like to receive DateTimeInterface
.
@gscscnd You are right. (Never read on phone in the sun! 🤦♂️ )
The following filtering is support:
- string to
DateTime
- string to
DateTimeImmutable
-
DateTime
toDateTimeImmutable
-
DateTimeImmutable
toDateTime
Is this correct or did I forget something?
- string to
DateTime
- string to
DateTimeImmutable
Actually I don’t check if a string
was provided, just pass it to DateTime
/DateTimeImmutable
constructor.
DateTime
toDateTimeImmutable
DateTimeImmutable
toDateTime
Also DateTime
to DateTime
and similarly for immutable.
We have to explicitly define all possible values for the filtering - input and ouput. Otherwise, we can not write the full documentation and all required unit tests.
Also
DateTime
toDateTime
and similarly for immutable.
This means:
-
DateTime
toDateTime
(new object,$immutable === false
) -
DateTime
toDateTimeImmutable
(new object,$immutable === true
) -
DateTimeImmutable
toDateTime
(new object,$immutable === false
) -
DateTimeImmutable
toDateTimeImmutable
(new object,$immutable === true
)
We can throw an InvalidArgumentException
if the user provides something other than DateTimeInterface|string
. The user can provide a valid string that at the same time (ahem) is not a valid datetime, but it’s probably Date Validator’s responsibility.
Anyway:
-
DateTime
→DateTime
-
DateTime
→DateTimeImmutable
-
DateTimeImmutable
→DateTime
-
DateTimeImmutable
→DateTimeImmutable
-
string
→DateTime
-
string
→DateTimeImmutable
@gscscnd
We can throw an
InvalidArgumentException
if the user provides something other thanDateTimeInterface|string
.
No exceptions are allowed during the process of filtering. If the given value can not be handled by the filter, the value should be returned unfiltered.
DateTime
→DateTime
DateTimeImmutable
→DateTimeImmutable
Does the filter create a new object each time or will the same object returned?
Can you describe the typical use case for this filter? Thanks!
No exceptions are allowed during the process of filtering. If the given value can not be handled by the filter, the value should be returned unfiltered.
:ok:, will fix that. (Current code doesn’t throw exceptions explicitly, but setting $value
to int
will surely cause the DateTime
constructor to throw.)
DateTime
→DateTime
DateTimeImmutable
→DateTimeImmutable
Does the filter create a new object each time or will the same object returned?
Returns the same instance.
Can you describe the typical use case for this filter? Thanks!
I’ve got a form (or any array of data, for that matter) with a datetime‑like input and an entity with a datetime‑like property. I setup an InputFilter with a Date validator and a DateTime filter. The input array contains 2019-04-25T08:02
(string
) and the (hydrated) output object has instance of DateTimeInterface
.
@gscscnd
The input array contains
2019-04-25T08:02
(string
) and the (hydrated) output object has instance ofDateTimeInterface
.
If you use zend-hydrator already then you can use Zend\Hydrator\Strategy\DateTimeFormatterStrategy
to get the desired result. Have you tried this strategy?
https://docs.zendframework.com/zend-hydrator/v3/strategy/#zend92hydrator92strategy92datetimeformatterstrategy
Well, I didn’t know about it. Thanks for the pointer!
This repository has been closed and moved to laminas/laminas-filter; a new issue has been opened at https://github.com/laminas/laminas-filter/issues/1.
This repository has been moved to laminas/laminas-filter. If you feel that this patch is still relevant, please re-open against that repository, and reference this issue. To re-open, we suggest the following workflow:
- Squash all commits in your branch (
git rebase -i origin/{branch}
) - Make a note of all changed files (`git diff --name-only origin/{branch}...HEAD
- Run the laminas/laminas-migration tool on the code.
- Clone laminas/laminas-filter to another directory.
- Copy the files from the second bullet point to the clone of laminas/laminas-filter.
- In your clone of laminas/laminas-filter, commit the files, push to your fork, and open the new PR. We will be providing tooling via laminas/laminas-migration soon to help automate the process.