在Laravel 5中,为什么在phpunit测试期间调用时,Request :: root()会有所不同?

kur*_*749 11 php url .htaccess phpunit laravel-5

我定义了一个测试用户创建的测试.控制器设置为在出错时重定向回同一页面(通过生成验证App\Http\Requests\Request).这在手动单击浏览器时可正常工作,但在测试期间失败.而不是重定向到:

http://localhost/account/create
Run Code Online (Sandbox Code Playgroud)

测试重定向到(缺少斜线):

http://localhostaccount/create
Run Code Online (Sandbox Code Playgroud)

这些网址都不是我在.htaccess或$urlconfig/app.php 中的变量中设置的.哪个是(在OSX Yosemite上):

http://~username/laravel_projects/projectname/public
Run Code Online (Sandbox Code Playgroud)

我最终指出这个问题与如何Request::root()产生结果有关.在测试之外调用此结果会导致在.htaccess和.htaccess中定义的期望值$url.在测试中,它导致:

http://localhost
Run Code Online (Sandbox Code Playgroud)

需要更改哪些配置才能使此函数在两个上下文中返回正确的值?

我还要提到我从Laravel 4到当前版本5.0.27的痛苦升级.

******更新*******

我能够找到一个可接受的解决方案/解决方案来解决这个问题!

在Laravel 5中,引入了FormRequests以帮助将验证逻辑移出控制器.一旦请求映射到控制器,如果指定了FormRequest(或只是Request),则在执行控制器操作之前执行此操作.

这种FormRequest默认处理响应如果验证失败.它会尝试根据您发布表单数据的路径构建重定向.在我的情况下,可能与我从Laravel 4更新到5的错误有关,这个默认重定向的构造不正确.用于处理响应的Laravel System代码如下所示:

 /**
 * Get the proper failed validation response for the request.
 *
 * @param  array  $errors
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function response(array $errors)
{
    if ($this->ajax() || $this->wantsJson())
    {
        return new JsonResponse($errors, 422);
    }
    return $this->redirector->to($this->getRedirectUrl())
                                    ->withInput($this->except($this->dontFlash))
                                    ->withErrors($errors, $this->errorBag);
}
Run Code Online (Sandbox Code Playgroud)

请注意返回的重定向与调用的方式不同Redirect::route('some_route').您可以通过在课程中加入来覆盖response功能.use ResponseRequest

在使用Redirect::route()创建重定向之后,我的测试中的逻辑传递了预期的结果.这是我的请求代码有效:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Http\Requests\Request;
use Response;

class AccountRequest extends FormRequest {

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
                  'email' => 'required|max:50|email|unique:users',
                  'password' => 'required|min:6',
                  'password_confirmation' => 'required|same:password'

                ];
    }

  public function response(array $errors){
    return \Redirect::route('account_create');
  }

}
Run Code Online (Sandbox Code Playgroud)

重要的是我调用了Redirect :: route而不是让默认的响应代码执行.

kur*_*749 2

重写 FormRequest 验证处理程序中的响应函数,以强制使用 Redirect::route('named_route') 构造重定向,而不是允许默认重定向。