处理表格提交Laravel 5

时间:2015-05-18 08:25:14

标签: php forms optimization laravel-5

我刚开始学习Laravel 5,我想知道处理提交表单的正确方法。我找到了许多教程,我们创建了两个单独的动作,第一个渲染表单,第二个实际处理表单。我来自Symfony2,在那里我们为渲染和处理提交表单创建了一个单独的动作,所以我想知道我需要创建两个单独的动作,因为那是Laravel方式,或者我可以将所有逻辑放在单个动作中,我像下面这样做,但我不喜欢我得到的代码:

public function create(Request $request)
{
    if (Input::get('title') !== null) {
        $v = Validator::make($request->all(), [
            'title'   => 'required|unique:posts',
            'content' => 'required',
        ]);
        if ($v->fails()) {
            return redirect()->back()->withErrors($v->errors());
        }
        $post = new Post(Input::all());
        if ($post->save()) {
            return redirect('posts');
        }
    }

    return view('add_post');
}

那么有人可以给我建议我需要做些什么吗?谢谢!

1 个答案:

答案 0 :(得分:3)

创建两个操作的最重要原因之一是避免重复提交表单。您可以阅读有关Post/Redirect/Get pattern的更多信息。

另一个重要原因是您保持代码清洁的方式。看看第一个变化:

public function showForm(){
    return view('add_post');
}

public function create(Request $request)
{
    $v = Validator::make($request->all(), [
            'title'   => 'required|unique:posts',
            'content' => 'required',
        ]);
        if ($v->fails()) {
            return redirect()->back()->withErrors($v->errors());
        }
        $post = new Post(Input::all());
        if ($post->save()) {
            return redirect('posts');
        }
    return redirect()->route('show_form')->withMessage();
}

您可以注意到的第一件事是create()函数不呈现任何视图,它用于管理创建逻辑(如名称本身所示)。如果您打算保持低调,那就没关系,但是当您确实需要添加其他验证甚至更好时会发生什么,重新利用其他控制器中的代码。例如,您的表单是发布评论的帮助工具,您希望仅允许“作者排名”的用户发表评论。这种考虑可以更容易地在特定操作中分离代码,而不是制作if-if-if-if意大利面条。再次...

public function showForm(){
    return view('add_post');
}

public function create(PublishPostRequest $request)
{
    $post = new Post($request->all());
    $post->save()
    return redirect('posts');
}

了解PublishPostRequest请求如何在适当的功能中发生。最后,为了充分利用Laravel 5,您可以创建一个请求类,以保留与验证和授权相关的所有代码:

class PublishPostRequest extends Request{

    public function rules(){
        return [
            'title'   => 'required|unique:posts',
            'content' => 'required',
        ]
    }

    public function authorize(){
        $allowedToPost = \Auth::user()->isAuthor();

        // if the user is not an author he can't post
        return $allowedToPost;    

    }
}

自定义请求类类的一个好处是,一旦通过函数参数注入控制器,它就会自动运行,因此您不必担心$v->fails()