This PR was merged into the 4.4 branch.
Discussion
----------
Use ">=" for the "php" requirement
| Q | A
| ------------- | ---
| Branch? | 4.4
| Bug fix? | kinda - prevents projects from installing on PHP 8.0 unnecessarily.
| New feature? | no
| Deprecations? | no
| Tickets | Fix #... <!-- prefix each issue number with "Fix #", if any -->
| License | MIT
| Doc PR | symfony/symfony-docs#... <!-- required for new features -->
Making the same change as f8aa0873cf but for a couple of places where it seems to have been missed.
Commits
-------
4a360766cc Use ">=" for the "php" requirement
This PR was squashed before being merged into the 4.4 branch.
Discussion
----------
[HttpClient] Fix promise behavior in HttplugClient
| Q | A
| ------------- | ---
| Branch? | 4.4 & up <!-- see below -->
| Bug fix? | yes
| New feature? | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tickets | Fix#37488 <!-- prefix each issue number with "Fix #", if any -->
| License | MIT
| Doc PR | symfony/symfony-docs#... <!-- required for new features -->
<!--
Replace this notice by a short README for your feature/bugfix. This will help people
understand your PR and can be used as a start for the documentation.
Additionally (see https://symfony.com/releases):
- Always add tests and ensure they pass.
- Never break backward compatibility (see https://symfony.com/bc).
- Bug fixes must be submitted against the lowest maintained branch where they apply
(lowest branches are regularly merged to upper ones so they get the fixes too.)
- Features and deprecations must be submitted against branch master.
-->
## The Problem
Promises have 2 important methods: `then` and `wait`.
To implement Httplug's promise interface, we built `HttplugPromise` on top of Guzzle promise.
However, when an error occurred (Httplug `NetworkException` thrown) while init the request/before actually sending the request,
`HttplugClient::sendAsyncRequest` will return a `Http\Promise\RejectedPromise`, which is a dummy implementation.
If the `then` callable returns a promise-like object, `Http\Promise\RejectedPromise` will treat it as plain value.
Guzzle promise will try to resolve the promise-like value, which is an object that has `then` method on it.
bbf3b200bc/src/Promise.php (L116)
To fix this, I edited `src/Symfony/Component/HttpClient/HttplugClient.php`.
Next, let me explain why to edit `src/Symfony/Component/HttpClient/Response/HttplugPromise.php`.
After the previous fix, when a Guzzle promise returned by the `then` callable, things will work.
However, If I return a `HttplugPromiseInterface`, it doesn't work, because Guzzle promise `wait` the return value (result)
only if it's a Guzzle promise.
bbf3b200bc/src/Promise.php (L63)
To fix this, I referenced the `wait` code of Guzzle promise and edited our `HttplugPromise`.
## How this fix make sense
So, why to return a promise from the `then` callable?
This let us change the promise chain according to current promise's result (fulfilled/rejected).
For example, we can retry an HTTP request if it failed.
Please take a look at my test code.
Commits
-------
147b6adc39 [HttpClient] Fix promise behavior in HttplugClient
* 5.1:
[HttpClient][CurlHttpClient] Fix http_version option usage
[HttpClient] fix parsing response headers in CurlResponse
[PropertyAccess] Remove inflector component
[Console] Do not check for "stty" using "exec" if that function is disabled
[Console] always use stty when possible to ask hidden questions
* 5.0:
[HttpClient][CurlHttpClient] Fix http_version option usage
[HttpClient] fix parsing response headers in CurlResponse
[Console] Do not check for "stty" using "exec" if that function is disabled
[Console] always use stty when possible to ask hidden questions
* 4.4:
[HttpClient][CurlHttpClient] Fix http_version option usage
[HttpClient] fix parsing response headers in CurlResponse
[Console] Do not check for "stty" using "exec" if that function is disabled
[Console] always use stty when possible to ask hidden questions
This PR was merged into the 4.4 branch.
Discussion
----------
[Console] always use stty when possible to ask hidden questions
| Q | A
| ------------- | ---
| Branch? | 4.4
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| Tickets | Fix#36565, replaces #36590
| License | MIT
| Doc PR | -
The current code doesn't make much sense: we check `hasSttyAvailable()`, and if the answer is `false`, we still use `stty` directly.
This PR relies on `stream_isatty` and equivalent fallback checks to decide if the password can be hidden or not.
Best reviewed [ignoring whitespaces](https://github.com/symfony/symfony/pull/37469/files?w=1).
Commits
-------
055b605e30 [Console] always use stty when possible to ask hidden questions
This PR was merged into the 5.1 branch.
Discussion
----------
[PropertyAccess] Remove inflector component
Remove inflector component as a requirements since the component is deprecated.
| Q | A
| ------------- | ---
| Branch? | 5.1
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| License | MIT
I hope I didn't miss something. I could not find a use of inflector component inside the PropertyAccess component and the inflector contains only one class that is deprecated
Commits
-------
8942d5a5b8 [PropertyAccess] Remove inflector component
This PR was merged into the 4.4 branch.
Discussion
----------
[HttpClient] fix parsing response headers in CurlResponse
| Q | A
| ------------- | ---
| Branch? | 4.4
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| Tickets | -
| License | MIT
| Doc PR | -
This fixes rare notices that look like:
`Argument 2 passed to Symfony\Component\HttpClient\Chunk\DataChunk::__construct() must be of the type string, null given`
I'm unable to provide a test case since I'm unable to provide a simple reproducer.
It happens that curl can call the header-function with multiple lines at once apparently, while most of the time it does so with one at a time.
Commits
-------
eb70fb2f26 [HttpClient] fix parsing response headers in CurlResponse
This PR was merged into the 4.4 branch.
Discussion
----------
[HttpClient][CurlHttpClient] Fix http_version option usage
| Q | A
| ------------- | ---
| Branch? | 4.4
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| Tickets | https://github.com/symfony/symfony/issues/37402
| License | MIT
| Doc PR | -
Ref https://github.com/symfony/symfony/pull/36422
If the scheme is https, we should only set http version 2.0 if the http_version is not specified.
Commits
-------
2676902a77 [HttpClient][CurlHttpClient] Fix http_version option usage
This PR was merged into the 5.2-dev branch.
Discussion
----------
[HttpClient] always yield a LastChunk in AsyncResponse on destruction
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| Tickets | -
| License | MIT
| Doc PR | -
This ensures that async decorators always "see" the destruction of an AsyncResponse, via an `isLast()` chunk + a "canceled" state.
[The diff](https://github.com/symfony/symfony/pull/37482/files?w=1) is hard to read, here are the hints to understand what changed:
- a __destructor has been added;
- the passthru logic has been moved to a new method but is essentially unchanged.
Commits
-------
3a4a58385e [HttpClient] always yield a LastChunk in AsyncResponse on destruction
This PR was squashed before being merged into the 3.4 branch.
Discussion
----------
[Console] Do not check for "stty" using "exec" if that function is disabled
| Q | A
| ------------- | ---
| Branch? | 3.4
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| Tickets | no
| License | MIT
| Doc PR | no
fixes https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/5030
Commits
-------
02124b6b3b [Console] Do not check for "stty" using "exec" if that function is disabled
This PR was merged into the 5.2-dev branch.
Discussion
----------
[TwigBundle] Fix translator argument for twig.extension.trans
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| Tickets |
| License | MIT
| Doc PR |
I fixed the Translator service argument for Translation Twig Extension, which was a bit hard to debug, because of `nullOnInvalid` and the anonymous class created in the Extension if Translator is null (https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Extension/TranslationExtension.php#L50).
Commits
-------
1cb35c0f7d [TwigBundle] Fix translator argument for twig.extension.trans
This PR was squashed before being merged into the 5.2-dev branch.
Discussion
----------
[Workflow] Added Function (and Twig extension) to retrieve a specific transition
You can now easily retrieve a specific transition. Useful when you want the metadata of a specific transition.
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| Deprecations? | no
| Tickets | hmmmm, should I create a ticket first ?
| License | MIT
| Doc PR | https://github.com/symfony/symfony-docs/pull/13907
I needed to get the metadata of a transition, but in order to do that, you need the transition object. So here is a PR to easily get the transition object
Commits
-------
0eebe74259 [Workflow] Added Function (and Twig extension) to retrieve a specific transition
This PR was merged into the 5.2-dev branch.
Discussion
----------
[HttpClient] Add MockResponse::getRequestMethod() and getRequestUrl() to allow inspecting which request has been sent
| Q | A
| ------------- | ---
| Branch? | 4.4
| Bug fix? | no
| New feature? | yes <!-- please update src/**/CHANGELOG.md files -->
| Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tickets | - <!-- prefix each issue number with "Fix #", if any -->
| License | MIT
| Doc PR | - <!-- required for new features -->
<!--
Replace this notice by a short README for your feature/bugfix. This will help people
understand your PR and can be used as a start for the documentation.
Additionally (see https://symfony.com/releases):
- Always add tests and ensure they pass.
- Never break backward compatibility (see https://symfony.com/bc).
- Bug fixes must be submitted against the lowest maintained branch where they apply
(lowest branches are regularly merged to upper ones so they get the fixes too.)
- Features and deprecations must be submitted against branch master.
-->
---
As same as the `MockResponse` class has `getRequestOptions()` when doing a request; I've added:
* `getRequestUrl()` - returns the URL used when doing the request
* `getRequestMethod()` - returns the HTTP method used when doing the request
With these two getters, we would be able to assert that the method and URL passed to the `HttpClient` were well generated. I've tried to assert the URL generated in a unit test of a class with a `SymfonyHttpClient` injected and it wasn't possible. Calling `$mock->getInfo('url')` returns `null`.
Example, if we have a class with `HttpClientInterface` injected like this:
```php
final class SymfonyHttpUserClient
{
private HttpClientInterface $httpClient;
private string $baseUri;
public function __construct(
HttpClientInterface $httpClient,
string $baseUri
) {
$this->httpClient = $httpClient;
$this->baseUri = $baseUri;
}
public function getById(string $userId): void
{
$this->httpClient->request(
'GET',
$this->baseUri . $customerId
);
}
}
```
And if we want to do a unit test of `SymfonyHttpUserClient` right now we are not able to check if the URL of the request was well-formed passing a `MockResponse`. Also, we weren't able to assert the HTTP method (maybe this piece is not so critical to assert in the unit test).
```php
class SymfonyHttpUserClientTests extends TestCase
{
public function testGetById(): void
{
$baseUri = 'https://user-api.test/api/v1/users/';
$mockResponse = new MockResponse();
$symfonyHttpUserClient = new SymfonyHttpUserClient(
new MockHttpClient(
[$mockResponse],
$baseUri
),
$baseUri
);
// test get by id:
$symfonyHttpUserClient->getById('some-user-id');
// cannot be asserted right now:
$this->assertSame($mockResponse->getInfo('url'), $baseUri . 'some-user-id'); // fail
$this->assertSame($mockResponse->getInfo('http_method'), 'GET'); // fail
// it could be with the new getters:
$this->assertSame($mockResponse->getRequestUrl(), $baseUri . 'some-user-id');
$this->assertSame($mockResponse->getRequestMethod(), 'GET');
}
}
```
This only happens if the class has injected the HttpClient and if it is used inside void methods with no being able to return the response. If the class returns the response, `url` and `http_method` are available with `$response->getInfo()` call. But this response object is a new one, is not the mock passed by argument when you instance the MockHttpClient.
Var dumps of `getInfo` array:
```
$response->getInfo() from MockClient:
..array(10) {
["start_time"]=>
float(1587109014.7985)
["user_data"]=>
NULL
["http_code"]=>
int(200)
["response_headers"]=>
array(0) {
}
["error"]=>
NULL
["canceled"]=>
bool(false)
["redirect_count"]=>
int(0)
["redirect_url"]=>
NULL
["http_method"]=>
string(3) "GET"
["url"]=>
string(47) "https://user-api.test/api/v1/users/some-user-id"
}
$mock->getInfo()
array(4) {
["http_code"]=>
int(200)
["response_headers"]=>
array(0) {
}
["error"]=>
NULL
["canceled"]=>
bool(false)
}
```
This is a minor change, I opened the PR with `4.4` as base branch; but not sure if it should be opened with `5.0` as base branch or even `master` taking account is a feature (add two new getters in MockResponse class). Let me know if I didn't follow right the instructions (first PR on Symfony project 😃)
Thanks!
Commits
-------
7a250d80c1 [HttpClient] Add MockResponse::getRequestMethod() and getRequestUrl() to allow inspecting which request has been sent
This PR was merged into the 5.2-dev branch.
Discussion
----------
Move event alias mappings to their components
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | no
| Deprecations? | no
| Tickets | N/A
| License | MIT
| Doc PR | N/A
For a small console tool, I wanted to use the Console, EventDispatcher and DI components standalone. In order to make use of aliased events, I had to copy over the mapping information from FrameworkBundle, which was a bit unfortunate.
With this PR, I'd like to suggest to store all alias mappings on the `*Events` classes of each component instead. This change will make the mapping reusable outside of the full-stack framework.
Note: I've bumped the dependencies of FrameworkBundle/SercurityBundle in order to gain access to the moved mapping information. If any of the bumps is too heavy, please tell me and I'll implement a fallback instead.
Commits
-------
28e6f6f72c Move event alias mappings to their components.
* 5.1:
[ErrorHandler] fix throwing from __toString()
Removed comments and requirements relative to php <5.5 (not supported anymore)
Fix caching of parent locales file in translator
fix validating lazy properties that evaluate to null
* 5.0:
[ErrorHandler] fix throwing from __toString()
Removed comments and requirements relative to php <5.5 (not supported anymore)
Fix caching of parent locales file in translator
fix validating lazy properties that evaluate to null
* 4.4:
[ErrorHandler] fix throwing from __toString()
Removed comments and requirements relative to php <5.5 (not supported anymore)
Fix caching of parent locales file in translator
fix validating lazy properties that evaluate to null