Я определил тест, который проверяет создание пользователя. Контроллер настроен на повторное перенаправление на ту же страницу при ошибке (с использованием проверки через сгенерированное 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, чтобы помочь вывести логику проверки из контроллеров. Когда запрос сопоставляется с контроллером, если FormRequest
(или просто Request
), это выполняется до того, как нажать на действие контроллера.
Этот FormRequest
по умолчанию обрабатывает ответ, если проверка не выполняется. Он пытается построить перенаправление на основе маршрута, на который вы отправили данные формы. В моем случае, возможно, связанный с ошибкой обновления мин от Laravel 4 до 5, это перенаправление по умолчанию было построено неправильно. Системный код Laravel для обработки ответа выглядит следующим образом:
/** * 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
, включив в свой класс Request
use Response
.
После использования 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 вместо того, чтобы разрешить выполнение кода ответа по умолчанию.
Переопределите функцию ответа в обработчике проверки FormRequest, чтобы принудительно перенаправить перенаправление с помощью Redirect :: route ('named_route') вместо разрешения перенаправления по умолчанию.
Вам нужно изменить значение url
файла config/app.php
. Значение по умолчанию: http://localhost
Doc из config/app.php
Этот URL-адрес используется консолью для правильного создания URL-адресов при использовании инструмента командной строки Artisan. Вы должны установить это в корневое приложение, чтобы оно использовалось при выполнении задач Artisan.
Я знаю, что это не точный ответ на ваш вопрос, так как это не обновление конфигурации, которое решает проблему. Но я боролся с связанной проблемой, и, похоже, это единственная запись в Интернете, в которой кто-то сталкивается с чем-то подобным – я думал, что поставил бы свои два цента для тех, кто хочет другого решения.
Обратите внимание, что я использую Laravel 4.2 на данный момент, так что это могло измениться в Laravel 5 (хотя я сомневаюсь).
Вы можете указать заголовок HTTP_HOST
когда вы тестируете контроллер с помощью функции:
$response = $this->call($method, $uri, $parameters, $files, $server, $content);
Чтобы указать заголовок, просто $server
переменную $server
как массив:
array('HTTP_HOST' => 'testing.mydomain.com');
Когда я сделал это, значение, созданное для моего Request::root()
было http://testing.mydomain.com
.
Опять же, я знаю, что это не обновление конфигурации, чтобы решить проблему, но, надеюсь, это может помочь кому-то, кто борется с проблемой, связанной с полу.