ホームページ  >  記事  >  バックエンド開発  >  Laravel 5 シリーズのチュートリアル 6: フォーム

Laravel 5 シリーズのチュートリアル 6: フォーム

WBOY
WBOYオリジナル
2016-06-20 12:49:291139ブラウズ

原文: 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

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。