我刚开始学习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');
}
那么有人可以给我建议我需要做些什么吗?谢谢!
答案 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()