Skip to content

[HttpFoundation] Allow DateTimeImmutable in Response setters #24677

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 26, 2017

Conversation

derrabus
Copy link
Member

Q A
Branch? 4.1
Bug fix? no
New feature? yes
BC breaks? no
Deprecations? no
Tests pass? yes
Fixed tickets none
License MIT
Doc PR TODO

Proposal

This PR adds the ability to use DateTimeImmutable objects instead of DateTime in the following setters of HttpFoundation's Response class.

  • setDate()
  • setExpires()
  • setLastModified()

The corresponding getters are not touched, meaning they will still return good old DateTime instances.

BC considerations

  • Calling code using DateTime objects will still work as before.
  • Classes derived from Response will break if they override one of the methods above. Since all of them are considered final in Symfony 4, none of them should be overridden, though.

@derrabus derrabus changed the title [HttpFundation] Allows DateTimeImmutable in Response DateTime setters [HttpFundation] Allow DateTimeImmutable in Response DateTime setters Oct 24, 2017
@derrabus derrabus changed the title [HttpFundation] Allow DateTimeImmutable in Response DateTime setters [HttpFundation] Allow DateTimeImmutable in Response setters Oct 24, 2017
@derrabus derrabus changed the title [HttpFundation] Allow DateTimeImmutable in Response setters [HttpFoundation] Allow DateTimeImmutable in Response setters Oct 24, 2017
@nicolas-grekas nicolas-grekas added this to the 4.1 milestone Oct 25, 2017
Copy link
Member

@nicolas-grekas nicolas-grekas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(even for 4.0)

Copy link
Member

@fabpot fabpot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok for 4.0 as well

$date = \DateTimeImmutable::createFromMutable($date);
}

$date = $date->setTimezone(new \DateTimeZone('UTC'));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct me if I'm wrong, but DateTimeInterface doesn't have a setTimezone method from what I can tell.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't. That's why the block above that line makes sure we're dealing with a DateTimeImmutable here.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To explain this a bit more: The sole purpose of DateTimeInterface is to allow type-hinting for objects that are either DateTime or DateTimeImmutable. Those are the only two implementations of that interface and the php runtime doesn't allow userland code to directly implement the interface.

So at the beginning of the method, $date has to be either, null, DateTime or DateTimeImmutable. For null, we have an early exit. A DateTime instance is converted to DateTimeImmutable.

So right here, $date has to be an instance of DateTimeImmutable which contains the method setTimezone().

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the php runtime doesn't allow userland code to directly implement the interface.

Does this include extensions? Regardless of php allowing it or not, it looks weird like this. Should probably throw an exception or ignore the setter when it's not supported.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need to handle something that doesn't happen. that's just adding visual noise. to me it's good as it is

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this include extensions?

An extension could probably do that, but it would be a very odd thing to do.

I could not even write a test for the case that we have a DateTimeInterface instance that is neither a DateTime nor a DateTimeImmutable instance. I don't think, we need to handle it.

@Tobion
Copy link
Contributor

Tobion commented Oct 26, 2017

Thank you @derrabus.

@Tobion Tobion merged commit cc7ccee into symfony:master Oct 26, 2017
Tobion added a commit that referenced this pull request Oct 26, 2017
…etters (derrabus)

This PR was merged into the 4.0-dev branch.

Discussion
----------

[HttpFoundation] Allow DateTimeImmutable in Response setters

| Q             | A
| ------------- | ---
| Branch?       | 4.1
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | none
| License       | MIT
| Doc PR        | TODO

## Proposal

This PR adds the ability to use `DateTimeImmutable` objects instead of `DateTime` in the following setters of HttpFoundation's `Response` class.

* `setDate()`
* `setExpires()`
* `setLastModified()`

The corresponding getters are not touched, meaning they will still return good old `DateTime` instances.

## BC considerations

* Calling code using `DateTime` objects will still work as before.
* Classes derived from `Response` will break if they override one of the methods above. Since all of them are considered final in Symfony 4, none of them should be overridden, though.

Commits
-------

cc7ccee Allow DateTimeImmutable in Response setters.
@derrabus derrabus deleted the response-with-dti branch October 26, 2017 10:08
@fabpot fabpot mentioned this pull request Oct 30, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants