Skip to content

Commit

Permalink
[10.x] Allow creation of PSR request with merged data (#48696)
Browse files Browse the repository at this point in the history
* Allow creation of PSR request with merged data

* Add dependencies to require-dev
  • Loading branch information
timacdonald committed Oct 13, 2023
1 parent 7817052 commit 967dab6
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 4 deletions.
6 changes: 4 additions & 2 deletions composer.json
Expand Up @@ -44,7 +44,7 @@
"symfony/console": "^6.2",
"symfony/error-handler": "^6.2",
"symfony/finder": "^6.2",
"symfony/http-foundation": "^6.2",
"symfony/http-foundation": "^6.3",
"symfony/http-kernel": "^6.2",
"symfony/mailer": "^6.2",
"symfony/mime": "^6.2",
Expand Down Expand Up @@ -104,13 +104,15 @@
"league/flysystem-read-only": "^3.3",
"league/flysystem-sftp-v3": "^3.0",
"mockery/mockery": "^1.5.1",
"nyholm/psr7": "^1.2",
"orchestra/testbench-core": "^8.12",
"pda/pheanstalk": "^4.0",
"phpstan/phpstan": "^1.4.7",
"phpunit/phpunit": "^10.0.7",
"predis/predis": "^2.0.2",
"symfony/cache": "^6.2",
"symfony/http-client": "^6.2.4"
"symfony/http-client": "^6.2.4",
"symfony/psr-http-message-bridge": "^2.0"
},
"provide": {
"psr/container-implementation": "1.1|2.0",
Expand Down
6 changes: 4 additions & 2 deletions src/Illuminate/Routing/RoutingServiceProvider.php
Expand Up @@ -137,8 +137,10 @@ protected function registerPsrRequest()
if (class_exists(Psr17Factory::class) && class_exists(PsrHttpFactory::class)) {
$psr17Factory = new Psr17Factory;

return (new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory))
->createRequest($app->make('request'));
return with((new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory))
->createRequest($illuminateRequest = $app->make('request')), fn ($request) => $request->withParsedBody(
array_merge($request->getParsedBody(), $illuminateRequest->getPayload()->all())
));
}

throw new BindingResolutionException('Unable to resolve PSR request. Please install the symfony/psr-http-message-bridge and nyholm/psr7 packages.');
Expand Down
109 changes: 109 additions & 0 deletions tests/Integration/Foundation/RoutingServiceProviderTest.php
@@ -0,0 +1,109 @@
<?php

namespace Illuminate\Tests\Integration\Foundation;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Orchestra\Testbench\TestCase;
use Psr\Http\Message\ServerRequestInterface;

class RoutingServiceProviderTest extends TestCase
{
public function testItIncludesMergedDataInServerRequestInterfaceInstancesUsingGetRequests()
{
Route::get('test-route', function (ServerRequestInterface $request) {
return $request->getParsedBody();
})->middleware(MergeDataMiddleware::class);

$response = $this->withoutExceptionHandling()->get('test-route?'.http_build_query([
'sent' => 'sent-data',
'overridden' => 'overriden-sent-data',
]));

$response->assertOk();
$response->assertExactJson([
'request-data' => 'request-data',
]);
}

public function testItIncludesMergedDataInServerRequestInterfaceInstancesUsingGetJsonRequests()
{
Route::get('test-route', function (ServerRequestInterface $request) {
return $request->getParsedBody();
})->middleware(MergeDataMiddleware::class);

$response = $this->getJson('test-route?'.http_build_query([
'sent' => 'sent-data',
'overridden' => 'overriden-sent-data',
]));

$response->assertOk();
$response->assertExactJson([
'json-data' => 'json-data',
'merged' => 'replaced-merged-data',
'overridden' => 'overriden-merged-data',
'request-data' => 'request-data',
]);
}

public function testItIncludesMergedDataInServerRequestInterfaceInstancesUsingPostRequests()
{
Route::post('test-route', function (ServerRequestInterface $request) {
return $request->getParsedBody();
})->middleware(MergeDataMiddleware::class);

$response = $this->post('test-route', [
'sent' => 'sent-data',
'overridden' => 'overriden-sent-data',
]);

$response->assertOk();
$response->assertExactJson([
'sent' => 'sent-data',
'merged' => 'replaced-merged-data',
'overridden' => 'overriden-merged-data',
'request-data' => 'request-data',
]);
}

public function testItIncludesMergedDataInServerRequestInterfaceInstancesUsingPostJsonRequests()
{
Route::post('test-route', function (ServerRequestInterface $request) {
return $request->getParsedBody();
})->middleware(MergeDataMiddleware::class);

$response = $this->postJson('test-route', [
'sent' => 'sent-data',
'overridden' => 'overriden-sent-data',
]);

$response->assertOk();
$response->assertExactJson([
'json-data' => 'json-data',
'sent' => 'sent-data',
'merged' => 'replaced-merged-data',
'overridden' => 'overriden-merged-data',
'request-data' => 'request-data',
]);
}
}

class MergeDataMiddleware
{
public function handle(Request $request, $next)
{
$request->merge(['merged' => 'first-merged-data']);

$request->merge(['merged' => 'replaced-merged-data']);

$request->merge(['overridden' => 'overriden-merged-data']);

$request->request->set('request-data', 'request-data');

$request->query->set('query-data', 'query-data');

$request->json()->set('json-data', 'json-data');

return $next($request);
}
}

0 comments on commit 967dab6

Please sign in to comment.