Перенаправление обратно с вводом, не работающим в laravel 5.5

Я уже много раз использовал обратное перенаправление с вводом. Но в этом проекте я не могу этого сделать. Это мой метод контролер, который обрабатывает запрос формы:

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,
    ];
}

Я не нахожу ни одной ошибки или чего-то не так. Вы что-нибудь видите? Есть ли заранее техника для отладки этого поведения? спасибо.

Вся логика проверки Auth::check() должна быть в middleware.

Kyslik 08.05.2018 11:14

@Kyslik, обратное перенаправление работает, и управление передается внутри Auth :: check (), поэтому я думаю, что это должно было сработать. Любой я пробовал. Я использовал промежуточное ПО вместо Auth :: check () и удалил из контроллера все еще ту же проблему.

Purushotam Sangroula 08.05.2018 11:30

Правильно ли я понимаю, что пользователь уже вошел в систему при нажатии на verifyMobileCode()?

Kyslik 08.05.2018 11:32

@Kyslik, вы абсолютно правы, пользователь авторизован, чтобы попасть на этот маршрут.

Purushotam Sangroula 08.05.2018 11:33

Проблема связана с пустым old()? Что показывает dd() для вашего последнего перенаправления с вводом?

Rezrazi 15.05.2018 14:04

Это действительно может работать для вас return redirect()->back()->withErrors('verification_code' ,'unv')->withInput(); Но что не показывает ?? Ошибки или поля ввода при сбое запроса. Пожалуйста, позволь мне сейчас

Fahadi Muhumuza 15.05.2018 15:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
6
5 982
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Мой подход будет использовать 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.

Дай мне попробовать.

Purushotam Sangroula 09.05.2018 08:20

Привет Кислик, сегодня пробую все решения. Подождите несколько часов.

Purushotam Sangroula 16.05.2018 10:50

@Puru Меня не волнуют награды и очки; если ответ не работает комментируйте; если работает, прокомментируйте; так что ответчик (в данном случае я) может действовать по нему.

Kyslik 16.05.2018 10:52

Это мило с вашей стороны, я проверяю все это перед тем, как исправить некоторые другие ошибки.

Purushotam Sangroula 16.05.2018 12:03

Привет, Кислик, у меня такая ошибка, не могли бы вы помочь мне разобраться. Метод [validateRequired | in] не существует.

Purushotam Sangroula 16.05.2018 12:50

@Puru Я отредактировал ответ, он должен быть string вместо array. Примечание: можно отправить массив, но каждое правило должно быть собственным ключом.

Kyslik 16.05.2018 13:29

Я тоже пробовал это, но не возвращаю ошибку и старое значение.

Purushotam Sangroula 16.05.2018 14:03

@Puru Если проверка не удалась, будет сгенерирован ответ перенаправления, чтобы отправить пользователя обратно в его предыдущее местоположение. Ошибки также будут перенесены в сеанс, чтобы они были доступны для отображения. Если запрос был запросом AJAX, пользователю будет возвращен HTTP-ответ с кодом состояния 422, включая JSON-представление ошибок проверки. Прямо из документации Laravel. Вы, должно быть, делаете что-то не так.

Kyslik 16.05.2018 14:09

Это не запрос ajax. Я, должно быть, делаю что-то не так, но не могу понять. Я. в случае неудачной проверки он возвращает меня, но не получает ошибку и старое значение.

Purushotam Sangroula 16.05.2018 14:11

Позвольте нам продолжить обсуждение в чате.

Kyslik 16.05.2018 14:11

@Puru У вас есть \ Illuminate \ Session \ Middleware \ StartSession :: class, дважды удалите один из массива 'web'. Это должно решить вашу проблему с сессиями. Удачи!

Kyslik 16.05.2018 14:41

Заменить ->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' );

Хотя этот ответ, вероятно, правильный и полезный, желательно, чтобы вы включили вместе с ним некоторые пояснения, чтобы объяснить, как он помогает решить проблему. Это станет особенно полезным в будущем, если произойдет изменение (возможно, не связанное с этим), из-за которого он перестанет работать, и пользователям необходимо понять, как это когда-то работало.

Erty Seidohl 16.05.2018 16:21

Ваш контроллер должен выглядеть так:

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

Надеюсь, это сработает для вас. Но вам не нужно отображать старые входные данные, так как код будет неправильным или что-то не так. Так что это не обязательно

Спасибо за ваше предложение. Попробовал, не вышло.

Purushotam Sangroula 16.05.2018 12:26

В контроллере

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, если вы не хотите, чтобы он был чем-то конкретным.

Другие вопросы по теме