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$_GETreturns[]

让我们在浏览器中做同样的测试:

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']);