Laravel 5.1 不允许你传入 url 参数(是否有配置)
Laravel 5.1 doesn't allow you to pass in url params (is there configuration)
考虑以下测试:
public function it_should_contain_a_list_of_investors_who_belong_to_one_or_more_investment() {
$this->createInvestment();
$investor = factory(User::class)->create([
'role_id' => 4
]);
$response = $this->actingAs($investor)
->call('GET', 'api/v1/investors?include=investments');
dd(json_decode($response->getContent()));
$this->assertNotEmpty(json_decode($response->getContent()));
}
现在考虑此测试调用的以下操作:
public function getAllInvestorsForCompany($slug)
{
$users = $this->investorEntity->usersForCompany($slug);
$resource = new Collection($users, new InvestorTransformer, 'investor');
dd($_GET);
if (isset($_GET['include'])) {
$usersData = $this->manager->parseIncludes($_GET['include'])->createData($resource)->toArray();
} else {
$usersData = $this->manager->createData($resource)->toArray();
}
return response()->json($usersData);
}
注意dd
、$_GET
returns[]
让我们在浏览器中做同样的测试:
array:1 [▼
"include" => "investments.offering.company"
]
好的,所以在浏览器中我返回 investments.offering.company,因为这就是我作为 ?include=
传递的内容,但在测试中它像 laravel 忽略了 ?include 和继续前进。
这是 laravel 5.1 测试的默认行为吗?如果是,我该如何关闭它?
不要在 Laravel 控制器中使用 $_GET
、$_POST
或 $_REQUEST
。你应该使用 Request
门面:
public function getAllInvestorsForCompany($slug)
{
$users = $this->investorEntity->usersForCompany($slug);
$resource = new Collection($users, new InvestorTransformer, 'investor');
if (Request::input('include')) {
$usersData = $this->manager->parseIncludes(Request::input('include'))->createData($resource)->toArray();
} else {
$usersData = $this->manager->createData($resource)->toArray();
}
return response()->json($usersData);
}
测试时,Laravel实际上 进行 HTTP 调用 - 它创建一个 Request
对象,然后将其传递给路由控制器,这就是为什么这些变量实际上不可用的原因。
使用 Request
facade 还允许你做一些事情,比如在输入不存在时设置默认值,并处理多种输入形式(比如 AngularJS 将数据发送为 JSON 在请求正文中,而不是 POST 或 GET 参数)。
call
的第三个参数用于参数。
$response = $this->actingAs($investor)
->call('GET', 'api/v1/investors', ['include' => 'investments']);
考虑以下测试:
public function it_should_contain_a_list_of_investors_who_belong_to_one_or_more_investment() {
$this->createInvestment();
$investor = factory(User::class)->create([
'role_id' => 4
]);
$response = $this->actingAs($investor)
->call('GET', 'api/v1/investors?include=investments');
dd(json_decode($response->getContent()));
$this->assertNotEmpty(json_decode($response->getContent()));
}
现在考虑此测试调用的以下操作:
public function getAllInvestorsForCompany($slug)
{
$users = $this->investorEntity->usersForCompany($slug);
$resource = new Collection($users, new InvestorTransformer, 'investor');
dd($_GET);
if (isset($_GET['include'])) {
$usersData = $this->manager->parseIncludes($_GET['include'])->createData($resource)->toArray();
} else {
$usersData = $this->manager->createData($resource)->toArray();
}
return response()->json($usersData);
}
注意dd
、$_GET
returns[]
让我们在浏览器中做同样的测试:
array:1 [▼
"include" => "investments.offering.company"
]
好的,所以在浏览器中我返回 investments.offering.company,因为这就是我作为 ?include=
传递的内容,但在测试中它像 laravel 忽略了 ?include 和继续前进。
这是 laravel 5.1 测试的默认行为吗?如果是,我该如何关闭它?
不要在 Laravel 控制器中使用 $_GET
、$_POST
或 $_REQUEST
。你应该使用 Request
门面:
public function getAllInvestorsForCompany($slug)
{
$users = $this->investorEntity->usersForCompany($slug);
$resource = new Collection($users, new InvestorTransformer, 'investor');
if (Request::input('include')) {
$usersData = $this->manager->parseIncludes(Request::input('include'))->createData($resource)->toArray();
} else {
$usersData = $this->manager->createData($resource)->toArray();
}
return response()->json($usersData);
}
测试时,Laravel实际上 进行 HTTP 调用 - 它创建一个 Request
对象,然后将其传递给路由控制器,这就是为什么这些变量实际上不可用的原因。
使用 Request
facade 还允许你做一些事情,比如在输入不存在时设置默认值,并处理多种输入形式(比如 AngularJS 将数据发送为 JSON 在请求正文中,而不是 POST 或 GET 参数)。
call
的第三个参数用于参数。
$response = $this->actingAs($investor)
->call('GET', 'api/v1/investors', ['include' => 'investments']);