原文: https://jellybool.com/post/programming-with-laravel-5-laravel-forms-input
始める前に、インターフェースを美しくしましょう最初に少しずつ:
まず https://github.com/JellyBool/blog-css-js にアクセスして静的ファイルを取得し、次の 3 つのファイルをそれぞれ変更します:
1. app.blade.php2. articles/index.blade.php3. articles/show.blade.php
以下 ビューコードの修正部分は、面倒な方はctrl+cを使っても大丈夫です。
app.blade.php 内: 元の @yield('content') コードを次のコードに置き換えます:
<body> <div class="container"> <section class="content"> <div class="pad group"> @yield('content') </div> </section> </div></body>
の外側に余分な div とセクションを追加するだけです。
次の 2 つの CSS ファイルを紹介します:
<link rel='stylesheet' href="/css/bootstrap.min.css" type='text/css' media='all'/><link rel='stylesheet' href="/css/all.css" type='text/css' media='all'/>
1 つはブートストラップで、もう 1 つはカスタマイズされます。
articles/index.blade.php ファイルで、各 $article を 6183ae7ee28ccbd225f190d863f41234,还要一堆比如 20b995da0dba1805933ce16d596b7c8c等你可以参照着写。
'title' 表示 name='title'
null 表示 value=''
'class'=>'form-control' 表示class='form-control',这里可以指定id,placeholder等一系列你想指定的属性
然而在Form::open()没有指定提交路径的情况之下,默认是提交到本页面,这样对于我们的清晰分工是不太好的,因为这个页面就是用来加载视图的,而对于我们表单提交的内容,我们希望用另外的方法来处理,所以我们来写一写吧。
首先在Form::open()指定表单提交的url,直接在加入url:
{!! Form::open(['url'=>'article/store']) !!}
我们指定表单post提交到article/store这个地址,然后在routes.php注册这个路由地址:
Route::post('article/store','ArticleController@store');
这里注意我们使用了Route::post而不是Route::get,这是用来接收post的路由。然后顺利成章,在ArticleController中创建store()方法:
public function store() { $input = Request::all(); return $input; }
在这个方法中,我们引入Laravel自带的Request并使用Request::all(),来获取所有的用户提交的过来的内容(这里指的是:_token,name很content),如果你想获取具体某一个表单输入的内容,可以使用Request::get(),比如Request::get('title'),然后直接return来看看用户到底输入了什么内容,我们来试试:
OK,成功拿到用户的提交的内容之后,我们需要将这些保存到数据库,怎么实现呢?在第四篇中,我们提到的Eloquent的create()方法现在就可以派上用场了,于是我们可以写成这样:
Article::create($input);
Laravel会自动过滤_token这个提交内容。
但是创建完一篇文章之后,我们并不是想return $input,而是想重新跳转到某个页面中,比如我们的首页,因为发表完文章,我们需要看到它是否成功出线在文章列表中,所以我们最后写一下:
public function store() { $input = Request::all(); Article::create($input); return redirect('/'); }
我们直接使用Laravel的redirect()函数进行跳转,跳转到首页。这个时候,短短的三行代码就可以将我们的逻辑实现了,那么我们来试试:
貌似成功了?但是我们觉得这个排序有点问题,最新创建的文章当然是在最上面的了,所以我们到ArticleController的index()方法中稍微修改一下:
public function index() { $articles = Article::latest()->get(); return view('articles.index',compact('articles')); }
将原来的all()换成了latest()->get(),刷新,
我们发现,最新的文章intro竟然空白,我们到数据库看看:
我们发现,刚刚创建的文章的intro为空值,而published_at为0000-00-00 00:00:00,这不是我们想要的,为什么会这样呢?因为我们在提交过来的时候,并没有这两个数据啊,为了解决这个问题,首先我们可以很暴力得将这两个数据在使用Article::create($input)之前配置好,比如:
public function store() { $input = Request::all(); //下面增加两行,顺便看看Request::get的使用 $input['intro'] = mb_substr(Request::get('content'),0,64); $input['published_at'] = Carbon::now(); Article::create($input); return redirect('/'); }
intro字段就直接取content字段的头64个,然后published_at就默认为创建的时间。目前开起来代码有点暴力,但是不失为一种解决方案,我们后续会使代码much cleaner。我们再来试试:
bang,成功了,我们在看看数据库:
到这里,我们创建一篇文章的基本流程就完成了,但是这里还有一个问题,如果你尝试在文章创建的页面什么都不填,直接提交数据,你看看会发生什么,如果不确定,你可以看看你的数据库,到底发生了什么。
鉴于最后的问题和牵涉到表单的内容,下一节貌似很顺理成章就应该说说表单验证了,在Laravel中就是Request Validation。
最后,
Happy Hacking