如果存在验证错误,则使用 {{ URL::p revious() }} 返回 Laravel 不起作用



我想在一个简单的 CRUD 编辑表单上制作一个取消按钮。但是,当出现验证错误时,取消按钮似乎不起作用。

我猜是因为它从controller@edit路由到controller@update按钮只是再次转到controller@edit而不是实际的上一页。这正常还是我做错了什么?我如何让它工作?

attendee/edit.blade.php

<div class=pull-right>
{{Form::submit('Update',array('class'=>'btn btn-success'))}}
<a href = "{{URL::previous()}}" class = 'btn btn-warning'>Cancel</a>
</div>
{{ Form::close() }}

路线.php

Route::get('user/attendees', 'UserController@getAttendees');
Route::resource('attendee', 'AttendeeController');

与会者控制器

public function edit($id)
{
    $user = Auth::user();
    if(empty($user->id))
        return Redirect::to('/');
    //return if attendee doesn't belong to user
    if( !($user->attendee->contains($id)) )
        return Redirect::to('user/index')->with( 'error', 'attendee id error.' );
    $attendee = Attendee::find($id);
    return View::make('attendees.edit', compact('attendee'));
}
/**
 * Update the specified attendee in storage.
 *
 * @param  int  $id
 * @return Response
 */
public function update($id)
{
    $attendee = Attendee::findOrFail($id);
    $validator = Validator::make($data = Input::all(), Attendee::$rules);
    if ($validator->fails())
    {
        return Redirect::back()->withErrors($validator)->withInput()->with('id', $id);
    }
    $attendee->update($data);
    return Redirect::intended();
}

用户控制器

public function getAttendees()
{
    list($user,$redirect) = $this->user->checkAuthAndRedirect('user');
    if($redirect){return $redirect;}
    // Show the page
    return View::make('site/user/attendees/index', compact('user'));
}

它实际上工作正常,只是用法不正确。

采取以下措施:

  1. 您在GET /attendee/edit/{id}提交表单
  2. 该表格将带您进入POST /attendee/edit/{id}
  3. 验证失败,并被重定向到GET /attendee/edit/{id}

不能使用 GET 以外的方法链接到页面。您之前的路线实际上是POST /attendee/edit/{id},但链接将始终GET

相反,指定要重定向到的页面,我通常使用该部分的索引。

我认为你应该添加一个隐藏的输入,就像这样

{!! Form::hidden('redirect_to', old('redirect_to', URL::previous())) !!}

并在链接中使用此值:

<a href="{{ old('redirect_to', URL::previous())}}">cancel</a>

在使用 Laravel 提供的验证器时,Redirect::back()并没有真正完成正确的事情。我之前所做的是将要重定向的页面作为表单中的隐藏输入传递回,然后简单地使用 Input::except("return") 忽略它。我的意思是:

// On your HTML Form
<input type="hidden" name="return" value="{{ Request::path() }}" />
// In your PHP Controller
$validator = Validator::make($data = Input::except("return"), Attendee::$rules);
if ($validator->fails())
{
    return Redirect::to(Input::get("return"))->withErrors($validator)->withInput()->with('id', $id);
}

希望这可以帮助阐明一些信息。其他选项正在返回到更高的位置,例如而不是attendee/edit/{id}重定向到attendee/edit/,但这完全取决于您网站的结构。

我现在正在通过 JS 在点击中使用浏览器。似乎有效:

<a onclick="window.history.back();">Back</a>

我用这个jquery来取消按钮。

$(document).ready(function(){
    $('a.back').click(function(){
        parent.history.back();
        return false;
    });
});

您可以使用前端验证来测试输入验证,而无需重新加载页面。所以 {{URL::p revious()}} 不会受到影响。最简单的方法是在你的Laravelcade中使用Ajax或验证器.js。

以下是如何在Laravel 5中使用jquery ajax来测试验证的完整示例,可能会有所帮助:http://itsolutionstuff.com/post/laravel-5-ajax-request-validation-exampleexample.html

最新更新