, . .
. !
, Laravel Illuminate\Http\Request Symfony\Component\HttpFoundation\Request. upstream URI setRequestUri(). . .
, . :
<?php
use Illuminate\Http\Request;
class ExampleTest extends TestCase
{
public function testBasicExample()
{
$request = new Request([], [], ['info' => 5]);
dd($request->route()->parameter('info'));
}
}
, :
: ()
Route
? route() null?
, ; getRouteResolver(). getRouteResolver() , route() , $route null. , ... .
HTTP- Laravel , . , , . , .
<?php
use Illuminate\Http\Request;
use Illuminate\Routing\Route;
class ExampleTest extends TestCase
{
public function testBasicExample()
{
$request = new Request([], [], ['info' => 5]);
$request->setRouteResolver(function () use ($request) {
return (new Route('GET', 'testing/{info}', []))->bind($request);
});
dd($request->route()->parameter('info'));
}
}
. Route Laravel RouteCollection .
, , . . phpunit, null ! dd($request->route()), , info, parameters :
Illuminate\Routing\Route {
0 => "GET"
1 => "HEAD"
]
"uses" => null
]
0 => "info"
]
-variables: array:1 [
0 => "info"
]
-tokens: array:2 [
0 => array:4 [
0 => "variable"
1 => "/"
2 => "[^/]++"
3 => "info"
]
1 => array:2 [
0 => "text"
1 => "/testing"
]
]
-staticPrefix: "/testing"
-regex: "#^/testing/(?P<info>[^/]++)$#s"
-pathVariables: array:1 [
0 => "info"
]
-hostVariables: []
-hostRegex: null
-hostTokens: []
}
}
['info' => 5] Request . Route , $parameters.
, $parameters bindParameters(), , , bindPathParameters(), ( ).
Symfony Symfony\Component\Routing\CompiledRoute ( ) , . , ( ).
protected function bindPathParameters(Request $request)
{
preg_match($this->compiled->getRegex(), '/'.$request->decodedPath(), $matches);
return $matches;
}
, , $request->decodedPath() /, . , , .
URI
decodedPath() Request, , , , prepareRequestUri() Symfony\Component\HttpFoundation\Request. , , .
URI , HTTP-. X_ORIGINAL_URL, X_REWRITE_URL, , , REQUEST_URI. spoof URI HTTP-. .
<?php
use Illuminate\Http\Request;
use Illuminate\Routing\Route;
class ExampleTest extends TestCase
{
public function testBasicExample()
{
$request = new Request([], [], [], [], [], ['REQUEST_URI' => 'testing/5']);
$request->setRouteResolver(function () use ($request) {
return (new Route('GET', 'testing/{info}', []))->bind($request);
});
dd($request->route()->parameter('info'));
}
}
, 5; info.
Cleanup
, simulateRequest() SimulatesRequests, .
Mocking
URI , , URI . - :
<?php
use Illuminate\Http\Request;
use Illuminate\Routing\Route;
class ExampleTest extends TestCase
{
public function testBasicExample()
{
$requestMock = Mockery::mock(Request::class)
->makePartial()
->shouldReceive('path')
->once()
->andReturn('testing/5');
app()->instance('request', $requestMock->getMock());
$request = request();
$request->setRouteResolver(function () use ($request) {
return (new Route('GET', 'testing/{info}', []))->bind($request);
});
dd($request->route()->parameter('info'));
}
}
5.