【问题标题】:Laravel 5 withInput old always emptyLaravel 5 withInput 老总是空的
【发布时间】:2017-09-11 12:30:59
【问题描述】:

我正在使用 Laravel 5 构建一个简单的登录表单,我想在发生错误时默认填写一些输入。 我的路由器按照给定的方式调用这些函数

Route::get('/login','AuthController@login');
Route::post('/login','AuthController@do_login');

我的控制器如下所示

namespace App\Http\Controllers;
use App;
use App\Models\User;
use Request;
use Illuminate\Support\Facades\Redirect;

class AuthController extends Controller {

   function login()
   {
       if(User::check())
       {
           /*User is logged, then cannot login*/
           return Redirect::back();
       }
       else
       {
           return view('auth.login');
       }
   }
    function do_login()
    {
        return view('auth.login')->withInput(Request::except("password"));
    }

}

注意到 PhpStorm 正在强调 withInput 表示在 Illuminate\View\View 中找不到它的实现。 在我看来,我有以下几点:

            {!! Form::open() !!}
            <div class="form-group">
                {!! Form::text('email', Input::old('email'), array('placeholder' => Lang::get('auth.email'), 'class' => 'form-control')) !!}
            </div>
            <div class="form-group">
                {!! Form::password('password', array('placeholder' => Lang::get('auth.password'),'class'=>'form-control')) !!}
            </div>
            <div class="form-group">
                <button class="btn btn-primary btn-block">@lang('auth.signin')</button>
                <span class="pull-right"><a href="/{{App::getLocale()}}/register">@lang('auth.register')</a></span>
            </div>
        <input type="email" class="form-control" name="email" value="{{ old('email') }}">
        {!! Form::close() !!}

我在这里缺少什么?这可以在 Laravel 5 中完成吗? 非常感谢您的宝贵时间!

【问题讨论】:

  • 只是一个建议,但由于您使用 Laravel 5,您还应该考虑使用中间件的机制,至少对于您的身份验证检查。 Laravel 默认带有非常有用的 auth/guest 中间件:laravel.com/docs/5.0/middleware

标签: php laravel laravel-5


【解决方案1】:

withInput() 用于在重定向期间保留输入。

如果您正在执行return view(),则没有必要(也不可能)调用它。

您可以考虑让您的do_login 执行return redirect()-&gt;back()-&gt;withInput(Request::except("password"));,以正确实施Post/Redirect/Get

【讨论】:

  • 非常感谢您的帮助。在我看来,访问该变量的代码是什么?其实我有{!! Form::text('email', Request::old('email'), array('placeholder' => Lang::get('auth.email'), 'class' => 'form-control')) !!} 但它不打印任何东西
  • @DiogoMendonça 因此,在您的代码中,输入实际上并不旧。 “旧”输入是在重定向期间使用 withInput 保留的输入。因为您在 POST 请求中显示了 view(),所以它实际上是当前数据 - Request::get('whatever') 就是您想要的。
  • 在我看来我制作 并且输出很奇怪: Array ( [_token] => KZS7Zq58P2y47GWpVfPWj9a5a4Mp6MoMXWOntPq9 [email] => )跨度>
  • 在我的控制器中,所有表单变量都在那里但为空:O jesus
  • 看来我误解了您的需求,抱歉 x)
【解决方案2】:

我建议您使用 MessageBag 类。 首先在控制器文件的顶部导入它的命名空间:

use Illuminate\Support\MessageBag;

然后你可以在你的控制器中使用它:

$message = new MessageBag(["username" => "A default and valid username"]); // Create your message
Redirect::to('auth/login')->withErrors($message); // Return it to your view, whatever the url

然后在您的身份验证/登录视图中:

{!! Form::text('username', Input::old('username'), array('placeholder' => ($errors->has('username')?$errors->first('username'):Lang::get('auth.username')), 'class' => 'form-control')) !!}

如果你愿意,你甚至可以替换输入的值:

{!! Form::text('username', ($errors->has('username')?$errors->first('username'):null), array('placeholder' => ($errors->has('username')?$errors->first('username'):Lang::get('auth.username')), 'class' => 'form-control')) !!}

如果遇到错误,您的“用户名”输入现在应该包含“默认且有效的用户名”消息。

【讨论】:

    【解决方案3】:

    在错误对象中传递数据是一个有用的提示吗?如果您要按照预期的方式使用错误对象怎么办?

    相反,有一种适当的方法可以做到这一点。您传递给 ->view 的第二个参数是数据!万岁!

    return view('your.view', dataYouWannaPass)
    

    完美地完成了这项工作!

    laravel 5.1 文档也推荐使用

    ->with($data)
    

    http://laravel.com/docs/5.1/views

    【讨论】:

    • 原来的问题是:“我想在发生错误时默认填充一些输入”。我不知道使用会话显示错误是被禁止的。
    【解决方案4】:

    我对这个问题的解决方案......而不是把你的路线放在里面

    Route::group(['middleware' => ['web']], function () { });
    

    只需删除它,它就会正常工作。它就像“网络”中间件加载了两次。

    【讨论】:

      【解决方案5】:

      以@AnthonyPillos 的回答为基础,

      Laravel 5.2.27 我认为它已经删除了对 web 中间件组的需求,因此为什么要删除它。

      所以:

      Route::group(['middleware' => ['web']], function () { });
      

      变得多余。

      希望它可以帮助其他人通过 validateRequests、validatesLogin 等进行搜索以发现它是路由。

      【讨论】:

        【解决方案6】:

        在 Laravel 5.2 中,你可以写 return Redirect::back()-&gt;withErrors([$errors])-&gt;withInput(Input::all());

        【讨论】:

          【解决方案7】:

          当你返回一个重定向需求时(http响应头“Location”项不为空),withInput对应的会话数据不会被擦除。所以下一个请求可以访问这个数据。

          当你返回没有重定向要求的响应页面时(“Location”项为空),withInput对应的会话数据将被清除。

          所以,我们可以看到“withInput”函数只在重定向中起作用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-16
            • 2014-01-16
            • 2016-10-25
            • 1970-01-01
            • 1970-01-01
            • 2015-10-29
            • 2014-12-22
            • 2017-08-31
            相关资源
            最近更新 更多