Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e24a062

Browse files
committed
Merge pull request #10446 from rentalhost/5.1-request-isset
[5.1] Fixes issue #10403: empty() over Request returns inconsistent results because __isset() is not defined.
2 parents f5458f7 + d410a6b commit e24a062

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

src/Illuminate/Http/Request.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,4 +896,27 @@ public function __get($key)
896896
return $this->route($key);
897897
}
898898
}
899+
900+
/**
901+
* Check if an input element was set in request.
902+
*
903+
* @param string $key
904+
* @return bool
905+
*/
906+
public function __isset($key)
907+
{
908+
$all = $this->all();
909+
910+
if (array_key_exists($key, $all)) {
911+
return true;
912+
}
913+
914+
$route = call_user_func($this->getRouteResolver());
915+
916+
if (is_null($route)) {
917+
return false;
918+
}
919+
920+
return array_key_exists($key, $route->parameters());
921+
}
899922
}

tests/Http/HttpRequestTest.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use Mockery as m;
44
use Illuminate\Http\Request;
5+
use Illuminate\Routing\Route;
56
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
67

78
class HttpRequestTest extends PHPUnit_Framework_TestCase
@@ -538,6 +539,80 @@ public function testCreateFromBase()
538539
$this->assertEquals($request->request->all(), $body);
539540
}
540541

542+
/**
543+
* Tests for Http\Request magic methods `__get()` and `__isset()`.
544+
*
545+
* @link https://github.com/laravel/framework/issues/10403 Form request object attribute returns empty when have some string.
546+
*/
547+
public function testMagicMethods()
548+
{
549+
// Simulates QueryStrings.
550+
$request = Request::create('/', 'GET', ['foo' => 'bar', 'empty' => '']);
551+
552+
// Parameter 'foo' is 'bar', then it ISSET and is NOT EMPTY.
553+
$this->assertEquals($request->foo, 'bar');
554+
$this->assertEquals(isset($request->foo), true);
555+
$this->assertEquals(empty($request->foo), false);
556+
557+
// Parameter 'empty' is '', then it ISSET and is EMPTY.
558+
$this->assertEquals($request->empty, '');
559+
$this->assertEquals(isset($request->empty), true);
560+
$this->assertEquals(empty($request->empty), true);
561+
562+
// Parameter 'undefined' is undefined/null, then it NOT ISSET and is EMPTY.
563+
$this->assertEquals($request->undefined, null);
564+
$this->assertEquals(isset($request->undefined), false);
565+
$this->assertEquals(empty($request->undefined), true);
566+
567+
// Simulates Route parameters.
568+
$request = Request::create('/example/bar', 'GET', ['xyz' => 'overwrited']);
569+
$request->setRouteResolver(function () use ($request) {
570+
$route = new Route('GET', '/example/{foo}/{xyz?}/{undefined?}', []);
571+
$route->bind($request);
572+
573+
return $route;
574+
});
575+
576+
// Router parameter 'foo' is 'bar', then it ISSET and is NOT EMPTY.
577+
$this->assertEquals($request->foo, 'bar');
578+
$this->assertEquals(isset($request->foo), true);
579+
$this->assertEquals(empty($request->foo), false);
580+
581+
// Router parameter 'undefined' is undefined/null, then it NOT ISSET and is EMPTY.
582+
$this->assertEquals($request->undefined, null);
583+
$this->assertEquals(isset($request->undefined), false);
584+
$this->assertEquals(empty($request->undefined), true);
585+
586+
// Special case: router parameter 'xyz' is 'overwrited' by QueryString, then it ISSET and is NOT EMPTY.
587+
// Basically, QueryStrings have priority over router parameters.
588+
$this->assertEquals($request->xyz, 'overwrited');
589+
$this->assertEquals(isset($request->foo), true);
590+
$this->assertEquals(empty($request->foo), false);
591+
592+
// Simulates empty QueryString and Routes.
593+
$request = Request::create('/', 'GET');
594+
$request->setRouteResolver(function () use ($request) {
595+
$route = new Route('GET', '/', []);
596+
$route->bind($request);
597+
598+
return $route;
599+
});
600+
601+
// Parameter 'undefined' is undefined/null, then it NOT ISSET and is EMPTY.
602+
$this->assertEquals($request->undefined, null);
603+
$this->assertEquals(isset($request->undefined), false);
604+
$this->assertEquals(empty($request->undefined), true);
605+
606+
// Special case: simulates empty QueryString and Routes, without the Route Resolver.
607+
// It'll happen when you try to get a parameter outside a route.
608+
$request = Request::create('/', 'GET');
609+
610+
// Parameter 'undefined' is undefined/null, then it NOT ISSET and is EMPTY.
611+
$this->assertEquals($request->undefined, null);
612+
$this->assertEquals(isset($request->undefined), false);
613+
$this->assertEquals(empty($request->undefined), true);
614+
}
615+
541616
public function testHttpRequestFlashCallsSessionFlashInputWithInputData()
542617
{
543618
$session = m::mock('Illuminate\Session\Store');

0 commit comments

Comments
 (0)