我正在学习Laravel 5.我正在尝试构建一个简单的表单来编辑数据库中的现有记录,我对如何在此使用withInput()
和old()
感到困惑情况下。
例如,请考虑以下路由和控制器:
<?php
// routes.php
use App\Book;
Route::get( '/book', [ 'as' => 'book.edit', function() {
$book = Book::find(1);
return view( 'book', [
'title' => $book->title
] );
} ] );
Route::post( '/book', [ 'as' => 'book.update', function() {
$validator = Validator::make( Request::all(), [
// This validator will (almost) always fail. This is deliberate, to
// illustrate the problem I'm describing.
'title' => 'in:zzzzz|required'
] );
if ( $validator->fails() ) {
return redirect( route('book.edit') )
->withInput()
->withErrors( $validator );
}
// TODO: save book
} ] );
这是相应的模板:
<!-- book.blade.php -->
<form action="{{ route('book.update') }}" method="post">
<label>Book Title:</label>
<input type="text" name="title" value="{{ $title }}">
@if ($errors->has('title'))
<strong>{{ $errors->first('title') }}</strong>
@endif
<button type="submit">Save</button>
{{ csrf_field() }}
</form>
现在,请考虑以下用户流程:
用户请求GET / book(我们将此页面称为#1)。 book.edit
控制器从数据库加载书的标题(恰好是“50 Shades of Grey”),并将该字符串传递给视图。用户在字段中看到预填充值为“50 Shades of Grey”的表单。到目前为止,非常好。
用户修改该标题 - 比如“双城记” - 并提交表格。
book.update
路由处理此请求,并发现它无效。它会将用户重定向回book.edit
路由(我们将此页面称为#2)。
book.edit
重新渲染相同的视图,再次将title
的值设置为“50灰度阴影”(这是不正确的)。
这是我要解决的部分:如何在页面加载#1上显示数据库中的标题,但是在页面加载#2时重新显示用户的输入?
现在,我理解为什么此代码以这种方式运行。我只是不明白我是怎么想的这样做。
可能的解决方案(以及我不喜欢它们的原因):
在我的模板中,我可以使用value="{{ old('title') }}"
代替value="{{ $title }}"
。这将解决页面加载#2上的问题 - 但这意味着页面加载#1上的title
字段将空白。
我可以在视图中添加一些逻辑 - 类似于:{{ if $wasRedirected ? old('title') : $title }}
这只是感觉是hackish和错误 - 它看起来不像应该在视图中那样。
我可以为book.edit
请求添加一些逻辑 - 类似于'title' => $wasRedirected ? Request::get('title') : $book->title
。这也感觉很乱和错误。
我可能只是误解了某些东西,或者遗漏了一些明显的东西。在Laravel 5中,编辑表单通常的处理方式如何?必须有一个标准模式,对吧?
答案 0 :(得分:1)
old()
助手的签名是:
function old($key = null, $default = null)
您可以将数据库中的值作为默认值传递。
old('title', $book->title)