Laravel 5 シリーズ チュートリアル 10: 記事の変更を実装する

WBOY
リリース: 2016-06-23 13:26:34
オリジナル
894 人が閲覧しました

原文は https://laravist.com/article/20 から

Laravist は私が立ち上げた Laravel コミュニティです。Laravel に関する質問がある場合は、ここに来て質問してください。問題を解決するのに最適です。今後、いくつかのビデオチュートリアルを録画しようとします。形式はおそらく次のとおりです

https://laravist.com/lesson/2

これまでの一連の記事を合わせて実現しました。記事を公開するプロセス全体ですが、場合によっては、特定の記事の内容を変更する必要がありますか?どうすればこれを達成できるでしょうか?実際、記事の作成方法を知った後、記事を編集(更新)するという考え方は非常に似ています。ここで注目に値する知識ポイントは、Form::model と getAttribute です。具体的な手順を見てみましょう:

ルートを登録します

routes.php で、編集ページのルートを登録します:

Route::get('article/edit/{id}','ArticleController@edit');
ログイン後にコピー

このルートはパラメータを受け入れます: id、これは記事の ID を意味します。この ID を使用して、変更する記事をクエリします。

edit メソッドを記述します

ルーティングに従って、ArticleController に edit() メソッドを追加します。

public function edit($id)    {        $article = Article::findOrFail($id);        $tags = Tag::lists('name', 'id');        return view('articles.edit',compact('article','tags'));    }
ログイン後にコピー

非常によく知られているように、まず、ID に基づいて編集する必要がある記事をクエリします。$tag については、 create() メソッド 同様に、$tags リストを取得します。次に、ビューをレンダリングし、クエリされた $article と $tags をビューに渡します。

ビューを作成する

上記の edit() メソッドは、article.edit(resources/views/articles/edit.blade.php) をレンダリングするビューを指定します。ここでは便宜上、create.blade Copy を直接作成します。 .php ビュー ファイル:

@extends('app')@section('content')    <h1>修改文章:{{ $article->title }}</h1>    {!! Form::model($article,['url'=>'article/update']) !!}    {!! Form::hidden('id',$article->id) !!}    <div class="form-group">        {!! Form::label('title','标题:') !!}        {!! Form::text('title',$article->title,['class'=>'form-control']) !!}    </div>    <div class="form-group">        {!! Form::label('content','正文:') !!}        {!! Form::textarea('content',$article->content,['class'=>'form-control']) !!}    </div>    <div class="form-group">        {!! Form::label('published_at','发布日期') !!}        {!! Form::input('date','published_at',$article->published_at->format('Y-m-d'),['class'=>'form-control']) !!}    </div>    <div class="form-group">        {!! Form::label('tag_list','选择标签') !!}        {!! Form::select('tag_list[]',$tags,null,['class'=>'form-control js-example-basic-multiple','multiple'=>'multiple']) !!}    </div>    <div class="form-group">        {!! Form::submit('修改文章',['class'=>'btn btn-success form-control']) !!}    </div>    {!! Form::close() !!}    @if($errors->any())        <ul class="alert alert-danger">            @foreach($errors->all() as $error)                <li>{{ $error }}</li>            @endforeach        </ul>    @endif    <script type="text/javascript">        $(function() {            $(".js-example-basic-multiple").select2({                placeholder: "添加标签"            });        });    </script>@endsection
ログイン後にコピー

ここでは次の点に注意します:

Form::hidden() を使用します

ここでは、この目的のためにそれを使用します (非表示のフォームは表示されないため) user ) は、ID があればすべてが簡単に処理できるため、今後のアップデートをより便利かつ暴力的にするためです。

フォーム入力フォームの初期値を設定します

{!! Form::text('title',$article->title,['class'=>'form-control') のようにして設定します]) !!} $article->title の形式で、フォームに初期値を割り当てます。

Form::model()を使用しました

Formを宣言するとき、単にForm::open()を使用するのではなく、最初にForm::model()にバインドしたいモデルを渡す必要があります。ここでは $article を使用します。これは edit() メソッドで見つけた $article です。これにはどのような利点があるでしょうか。

Form::model() がバインドされると、後続の入力フォームで初期値を設定しなくても、laravel が自動的にそれを照合し、

初期値を提供します。これも利点の 1 つです。たとえば、上記の Form::model の下の {!! Form::text('title',$article->title,['class'=>'form-control']) !!} ()、前と同じように書くことができます:

{!! Form::text('title',null,['class'=>'form-control']) !!}
ログイン後にコピー

同じ効果が得られますが、わかりやすくするために、$article->title の初期値を直接割り当てました。

またCarbonを使います

記事のpublished_atフィールドでは、$article->published_at->format('Y-m-d')を拝借して、改めてCarbonの便利さを感じます。

最後に、編集ページが適切かどうかを確認してみましょう:

注意深く見ると、タグがまだ同期されておらず、表示されるタグの選択がすべて空であるため、編集が完全には実現されていないことがわかります。はい、元の記事にはタグが付いていますが、これについてはどうすればよいでしょうか。

getAttribute

getAttribute を表示する準備ができました。tag_list[] の便利な機能を使用して、Article.php で getAttribute メソッドを設定できます。

 public function getTagListAttribute()    {        // laravel 5.1 needs all()        return $this->tags->lists('id')->all();        // tags means tags() many-to-many relationship with tag    }
ログイン後にコピー

ここで、同様の getAttribute はすべてキャメルケースを使用することを説明する必要があります。方法。そして、値を取得するときは一律にアンダースコアメソッドを使用します。たとえば、ここでの tag_list は TagList に対応します。tag_involved と記述すると、メソッドは getTagInvolvedAttribute() になります。このように書くとlaravelが自動的にこの値を取得します。

laravel バージョン 5.0 は次のように書かれていることに注意してください return $this->tags->lists('id');

効果を見てみましょう:

OK、これで完了です編集ページで、Form::model() の URL に基づいて投稿ルートを登録します

投稿ルートを登録します

routes.php に移動し、更新メソッドに投稿ルートを追加します:

Route::post('article/update','ArticleController@update');
ログイン後にコピー

記事はarticle/updateに送信され、ArticleControllerのupdate()メソッドがトリガーされます。

update() を書きます

ArticleController に update() メソッドを追加します:

public function update(Requests\StoreArticleRequest $request)    {        //这里使用同样地验证规则       dd($request->all());    }
ログイン後にコピー

送信されたデータを取得したかどうかを確認してみましょう:

OK、データを取得しようとしています、次のステップはそれを実装することです更新しました。 update() メソッドを変更します:

public function update(Requests\StoreArticleRequest $request)    {        //根据id查询到需要更新的article        $article = Article::find($request->get('id'));        //使用Eloquent的update()方法来更新,        //request的except()是排除某个提交过来的数据,我们这里排除id        $article->update($request->except('id'));        // 跟attach()类似,我们这里使用sync()来同步我们的标签        $article->tags()->sync($request->get('tag_list'));                return redirect('/');    }
ログイン後にコピー

OK、コード ロジックが実装されたら、更新が成功するかどうかを確認してみましょう:

完了、仕事は完了です。 !

概要

チュートリアルに従っている場合は、記事を変更するプロセスが非常に明確になるはずです。ここでもそれを改めて感じます:

注册路由--->控制器写方法--->加载视图
ログイン後にコピー

这一个神奇的轮回。这里还是需要强调的是Form::model()和getAttribute这两个知识点。

最后,到这里,貌似我们的整个教程就可以结束了。下面我打算再开一个系列说说laravel 5.1的新特性.

Happy Hacking

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート