Я уже много раз использовал обратное перенаправление с вводом. Но в этом проекте я не могу этого сделать. Это мой метод контролер, который обрабатывает запрос формы:
public function verifyMobileCode( Request $request)
{
$userId = Auth::user()->id;
if ( Auth::user()->verification_code == $request['verification_code'])
{
User::where('id', $userId)->update(['verified'=>1]);
return redirect('/')->with('success', 'Account verified.');
}
else
{
return redirect()->back()->withErrors('verification_code' ,'unv' )->withInput($request->all());
}
}
Это мой клинок формы:
@extends('layouts.index')
@section('content')
<div class = "container" style='padding-top: 150px;'>
<?php var_dump($errors) ; ?>
<div class = "row">
<div class = "col-md-8 col-md-offset-2">
<div class = "panel panel-default">
<div class = "panel-heading">Verify your mobile</div>
<div class = "panel-body">
<form class = "form-horizontal" method = "POST" action = "{{ route('verifyMobileCode') }}">
{{ csrf_field() }}
<div class = "form-group{{ $errors->has('verification_code') ? ' has-error' : '' }}">
<label for = "verification_code" class = "col-md-4 control-label">Verification code</label>
<div class = "col-md-6">
<input id = "verification_code" type = "text" class = "form-control" name = "verification_code" value = "{!! old('verification_code') !!}" required autofocus maxlength = "6" pattern = "\d{6}">
@if ($errors->has('verification_code'))
<span class = "help-block">
<strong>Please enter 6 digit number sent to your mobile.</strong>
</span>
@endif
</div>
</div>
<div class = "form-group">
<div class = "col-md-6 col-md-offset-4">
<button type = "submit" class = "btn btn-primary">
Register
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Мой Kernel.php выглядит следующим образом:
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\LanguageSwitcher::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'is-admin' => \App\Http\Middleware\IsAdminMiddleware::class,
];
}
Я не нахожу ни одной ошибки или чего-то не так. Вы что-нибудь видите? Есть ли заранее техника для отладки этого поведения? спасибо.
@Kyslik, обратное перенаправление работает, и управление передается внутри Auth :: check (), поэтому я думаю, что это должно было сработать. Любой я пробовал. Я использовал промежуточное ПО вместо Auth :: check () и удалил из контроллера все еще ту же проблему.
Правильно ли я понимаю, что пользователь уже вошел в систему при нажатии на verifyMobileCode()?
@Kyslik, вы абсолютно правы, пользователь авторизован, чтобы попасть на этот маршрут.
Проблема связана с пустым old()? Что показывает dd() для вашего последнего перенаправления с вводом?
Это действительно может работать для вас return redirect()->back()->withErrors('verification_code' ,'unv')->withInput(); Но что не показывает ?? Ошибки или поля ввода при сбое запроса. Пожалуйста, позволь мне сейчас






Мой подход будет использовать FormRequest.
php artisan make:request VerifyCodeRequest
И тело запроса:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class VerifyCodeRequest 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 [
'verification_code' => 'required|in:'.$this->user()->verification_code, // since user is already logged in we check if verification_code matches using `in` rule
];
}
public function messages()
{
return [
'in' => 'Your custom error message if we failed',
];
}
}
Теперь вы меняете подпись verifyMobileCode(...) на следующую verifyMobileCode(App\Http\Requests\VerifyCodeRequest $request).
Теперь код выполняет тело функции только если, мы проходим проверку, поэтому нам нужно обновить экземпляр пользователя, и все готово.
public function verifyMobileCode(App\Http\Requests\VerifyCodeRequest $request)
{
$request->user()->verify();
return redirect('/')->with('success', 'Account verified.');
}
Внутри модели пользователя добавить функцию verify()
public function verify()
{
$this->update(['verified' => true]);
}
Если ваш подход, описанный выше, не работает, есть проблема с вашим app/Http/Kernel.php. Вы использовали
\Illuminate\Session\Middleware\StartSession::class,
дважды. Вы должны удалить один. Наверное, первый.
См. Стандартный Laravel kernel.php.
Дай мне попробовать.
Привет Кислик, сегодня пробую все решения. Подождите несколько часов.
@Puru Меня не волнуют награды и очки; если ответ не работает комментируйте; если работает, прокомментируйте; так что ответчик (в данном случае я) может действовать по нему.
Это мило с вашей стороны, я проверяю все это перед тем, как исправить некоторые другие ошибки.
Привет, Кислик, у меня такая ошибка, не могли бы вы помочь мне разобраться. Метод [validateRequired | in] не существует.
@Puru Я отредактировал ответ, он должен быть string вместо array. Примечание: можно отправить массив, но каждое правило должно быть собственным ключом.
Я тоже пробовал это, но не возвращаю ошибку и старое значение.
@Puru Если проверка не удалась, будет сгенерирован ответ перенаправления, чтобы отправить пользователя обратно в его предыдущее местоположение. Ошибки также будут перенесены в сеанс, чтобы они были доступны для отображения. Если запрос был запросом AJAX, пользователю будет возвращен HTTP-ответ с кодом состояния 422, включая JSON-представление ошибок проверки. Прямо из документации Laravel. Вы, должно быть, делаете что-то не так.
Это не запрос ajax. Я, должно быть, делаю что-то не так, но не могу понять. Я. в случае неудачной проверки он возвращает меня, но не получает ошибку и старое значение.
Позвольте нам продолжить обсуждение в чате.
@Puru У вас есть \ Illuminate \ Session \ Middleware \ StartSession :: class, дважды удалите один из массива 'web'. Это должно решить вашу проблему с сессиями. Удачи!
Заменить ->withInput($request->all()); на ->withInput();
если вы не хотите, чтобы какой-либо вход использовал
->withInput(
$request->except('input_name')
);
Чтобы отладить это, не прибегая к Xdebug, можно быстро добавить временный код отладки в начало файла лезвия:
@php
dd($errors->toArray(), $errors->has('verification_code'));
@endphp
Это даст вам следующий результат:
array:1 [
0 => array:1 [
0 => "verification_code"
]
]
false
Это показывает, что логика в блейд-файле не оценивается как правда, который требуется для отображения стилей ошибок и сообщений.
Быстрое решение - изменить используемый контроллер:
->withErrors(['verification_code' => 'unv'])
withErrors ожидает как MessageBag или массив, но приведет к преобразованию строки в массив, который не приведет к правильной паре ключ / значение.
Теперь вывод отладки будет показывать:
array:1 [
"verification_code" => array:1 [
0 => "unv"
]
]
true
Теперь отладочный код можно удалить, и ошибка должна отображаться должным образом.
Правильный способ Laravel, вероятно, - использовать $ request-> validate () или FormRequest для сложных форм. Для получения дополнительной информации см. Документацию по валидации Laravel (https://laravel.com/docs/5.5/validation).
return redirect()->back()->withInput()->withErrors('verification_code' ,'unv' );
Хотя этот ответ, вероятно, правильный и полезный, желательно, чтобы вы включили вместе с ним некоторые пояснения, чтобы объяснить, как он помогает решить проблему. Это станет особенно полезным в будущем, если произойдет изменение (возможно, не связанное с этим), из-за которого он перестанет работать, и пользователям необходимо понять, как это когда-то работало.
Ваш контроллер должен выглядеть так:
public function verifyMobileCode( Request $request)
{
$userId = Auth::user()->id;
if ( Auth::user()->verification_code == $request['verification_code'])
{
User::where('id', $userId)->update(['verified'=>1]);
return redirect('/')->with('success', 'Account verified.');
}
else
{
return redirect()->back()->withErrors('message' ,'Please some errors encountered.' );
}
}
И измените это
<div class = "form-group{{ $errors->has('verification_code') ? ' has-error' : '' }}">
К этому:
<div class = "form-group>
@include('errors');
Также создайте файл с именем errors.blade.php в ресурсах / представлениях и поместите следующий код:
@if ($errors->any())
<div class = "card"> //incase bootstrap 4
<div class = "error card-body alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
</div>
@endif
Надеюсь, это сработает для вас. Но вам не нужно отображать старые входные данные, так как код будет неправильным или что-то не так. Так что это не обязательно
Спасибо за ваше предложение. Попробовал, не вышло.
В контроллере
return redirect()->back()->withErrors('verification_code' ,'unv')->withInput();
С учетом
если вы хотите получить проверенное значение поля ввода, вам необходимо использовать класс laravel FORM для <form></form>, а также поля <input>
пример
{{ Form::open(['method' => 'post','url' => 'Your url','class'=>'form-horizontal']) }}
{{ Form::text('verification_code','',['class'=>'form-control']) }}
{{ Form::close() }}
кто-нибудь на Laravel 8, это должно работать
return back()->withErrors('your error message is here');
Если вы посмотрите на сигнатуру функции withErrors, второй параметр - это ключ, и он установлен на default, если вы не хотите, чтобы он был чем-то конкретным.
Вся логика проверки
Auth::check()должна быть в middleware.