如果存在验证错误,使用{{URL :: previous()}}的Laravel不起作用

时间:2014-12-30 14:36:38

标签: laravel

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

我猜因为它从控制器@编辑路由到控制器@更新按钮只是再次转到控制器@编辑而不是实际的前一页。这是正常的还是我做错了什么?我如何使它工作?

与会者/ 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() }}

routes.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'));
}

6 个答案:

答案 0 :(得分:2)

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

采取以下措施:

  1. 您在GET /attendee/edit/{id}
  2. 提交表单
  3. 表格会将您带到POST /attendee/edit/{id}
  4. 您未通过验证,并被重定向至GET /attendee/edit/{id}
  5. 您无法使用GET以外的方法链接到某个页面。您之前的路线实际上是POST /attendee/edit/{id},但链接始终为GET

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

答案 1 :(得分:2)

我认为你应该添加一个隐藏的输入,比如这个

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

并在您的链接中使用此值:

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

答案 2 :(得分:1)

使用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/,但这一切都取决于您网站的结构。

答案 3 :(得分:0)

我用这个jquery作为取消按钮。

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

答案 4 :(得分:0)

您可以使用前端验证来测试输入验证,而无需重新加载页面。因此{{URL :: previous()}}不会受到影响。 这样做的简单方法是在Laravel cade中使用Ajax或validator.js。

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

答案 5 :(得分:0)

我现在在 onclick 中通过JS使用浏览器。似乎可以工作:

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