Я определил тест, который проверяет создание пользователя. Контроллер настроен на повторное перенаправление на ту же страницу при ошибке (с использованием проверки через сгенерированный App\Http\Requests\Request
). Это работает правильно при ручном нажатии в браузере, но сбой во время теста. Вместо перенаправления на:
http://localhost/account/create
Тест перенаправляется (отсутствует косая черта):
http://localhostaccount/create
Ни один из этих URL-адресов не является тем, что я установил в .htaccess или в переменной $url
в config/app.php. Что (в OSX Yosemite):
http://~username/laravel_projects/projectname/public
Я, наконец, определил проблему, чтобы иметь какое-то отношение к тому, как создается результат Request::root()
. Выполнение вызова за пределами теста приводит к ожидаемому значению, определенному в .htaccess и $url
. Внутри теста это приводит к:
http://localhost
Какую конфигурацию необходимо изменить, чтобы вернуть эту функцию в правильное значение в обоих контекстах?
Я также должен упомянуть, что я сделал мучительное обновление от Laravel 4 до текущей версии 5.0.27.
****** ОБНОВЛЕНИЕ *******
Мне удалось найти приемлемое решение/обходное решение этой проблемы!
В Laravel 5 были введены FormRequests, чтобы помочь переместить validation логику из контроллеров. Когда запрос сопоставляется с контроллером, если указан 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);
}
Обратите внимание, что возвращаемое перенаправление НЕ совпадает с вызовом Redirect::route('some_route')
. Вы можете переопределить эту функцию response
, включив use Response
в свой Request
класс.
После использования 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');
}
}
Важной частью является то, что я назвал Redirect:: route вместо того, чтобы разрешить выполнение кода ответа по умолчанию.